两个停靠的组件,其中第二个填充剩余空间

时间:2012-08-23 11:56:00

标签: java swing layout

我正在制作一个棋盘游戏,我希望这个棋盘是一个方形停靠的西部,尺寸为frameHeight x frameHeight,我想要一个停靠在东边的侧板来填充剩下的。

本质:
西 - frameHeight x frameHeight
东 - remainingWidth x frameHeight

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

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

任何有理智的人都会接近这个?

3 个答案:

答案 0 :(得分:1)

  1. 如果DockingPanel可以覆盖部分JFrame(具有显示和隐藏功能),则使用

    • GlassPane(请注意,所有JComponents必须为lightweight,否则GlassPane会落后于其他人)

    • JLayer(基于Java6 JXLayer

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

答案 1 :(得分:1)

您可以覆盖getPreferredSize()方法,根据其父级的大小来调整面板的大小。请记住,此时您完全忽略了面板中任何内容的大小。如果您仍然关心这一点,我建议您延长JScrollPane而不是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();
                }
            }
        });

    }

}

答案 2 :(得分: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");