2

我正在开发一款棋盘游戏,我希望棋盘是一个靠西的正方形,尺寸为 frameHeight x frameHeight,我希望靠东的侧面板可以填充剩余的部分。

本质上:
West - frameHeight x frameHeight
East - remainingWidth x frameHeight

 _________________
|          |      |
|          |      |
|  WEST    | EAST |
|          |      |
|          |      |
|__________|______|

目前使用 MigLayout 我说 LARGE(西)的高度应该是 100%,但我不确定如何说宽度应该等于父高度的 100%,并且让 SMALL(东)填充剩余的宽度。

任何有一个不错的想法来解决这个问题的人?

4

3 回答 3

1
  1. DockingPanel可以覆盖部分JFrame(具有显示和隐藏功能)的情况下,然后使用

    • GlassPane(注意都JComponents必须是lightweight,否则GlassPane往后走)

    • JLayer(基于 Java6 JXLayer

  2. 最舒服的可能是使用JSplitPane

于 2012-08-23T12:12:03.303 回答
1

您可以覆盖该getPreferredSize()方法以根据其父级的大小来计算面板的大小。请记住,此时您完全忽略了面板中任何内容的大小。如果您仍然关心这一点,我建议您扩展 aJScrollPane而不是 a JPanel

import java.awt.*;
import javax.swing.*;

public class TempProject extends JPanel{

    enum Type{
        SQUARE,
        FILL
    };

    Type mytype;

    public TempProject(Type type){
        mytype = type;
        if(mytype == Type.SQUARE){
            setBackground(Color.orange);
        } else if(mytype == Type.FILL){
            setBackground(Color.blue);
        }
    }

    @Override
    public Dimension getPreferredSize(){
        Dimension result = getParent().getSize();
        if(mytype == Type.SQUARE){
            //Calculate square size
            result.width = result.height;

        } else if(mytype == Type.FILL){
            //Calculate fill size
            int tempWidth = result.width - result.height;
            if(tempWidth > 0){  // Ensure width stays greater than 0
                result.width = tempWidth;
            } else{
                result.width = 0;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    JFrame f = new JFrame("Java Game");
                    f.setSize(700, 500);
                    f.setVisible(true);
                    f.setBackground(Color.GRAY);

                    Box contentPanel = Box.createHorizontalBox();
                    contentPanel.add(new TempProject(Type.SQUARE));
                    contentPanel.add(new TempProject(Type.FILL));
                    f.setContentPane(contentPanel);

                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

    }

}
于 2012-08-23T14:15:54.480 回答
1

MiGLayout 不允许您使用大小约束的引用,但您可以使用约束来做到这一点pos

add(panel, "id large, pos 0 0 container.h container.h");

这将添加panel看似停靠到左边缘,覆盖整个高度并且宽度等于其高度。

然后,您可以使用以下内容填充剩余空间:

add(otherPanel, "pos large.x2 0 container.w container.h");
于 2012-08-23T14:16:37.840 回答