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

Java 两个停靠组件,其中第二个组件填充剩余空间,java,swing,layout,Java,Swing,Layout,我正在做一个棋盘游戏,我希望棋盘是一个正方形,向西停靠,尺寸为frameHeight x frameHeight,我希望侧面板停靠在东部,以填充剩余的 本质上: 西-帧高x帧高 东-剩余宽度x框架高度 _________________ | | | | | | | WEST | EAST | | | | | | | |__________|______| 使用MigLayo

我正在做一个棋盘游戏,我希望棋盘是一个正方形,向西停靠,尺寸为frameHeight x frameHeight,我希望侧面板停靠在东部,以填充剩余的

本质上:
西-帧高x帧高
东-剩余宽度x框架高度

 _________________
|          |      |
|          |      |
|  WEST    | EAST |
|          |      |
|          |      |
|__________|______|
使用MigLayout目前我说的是大(西)的高度应该是100%,但我不确定如何说宽度应该等于父高度的100%,并用小(东)填充剩余的宽度

有没有人能想出一个好办法

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

    • GlassPane
      (注意所有
      JComponents
      都必须是
      轻量级的
      ,否则
      GlassPane
      会落后)

    • JLayer
      (基于Java6
      JXLayer

  • 最方便的方法是使用
    JSplitPane


  • 您可以重写
    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();
                    }
                }
            });
    
        }
    
    }
    

    MiGLayout不允许对大小约束使用引用,但可以使用
    pos
    约束:

    add(panel, "id large, pos 0 0 container.h container.h");
    
    这将添加
    面板
    似乎停靠在左边缘,覆盖整个高度,宽度等于其高度

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

    add(otherPanel, "pos large.x2 0 container.w container.h");
    

    你的意思是“West-frameWidth x frameHeight”吗?不,宽度应该是高度-即正方形。如何为高度分配额外的空间?“最小的”和“更大的WxH”中的GUI ASCII艺术在这一点上非常方便。但是我在哪里设置容器的id呢?@paranoid android它是由miglaway自动设置的id:D@paranoid-android没问题:)我编辑了这些约束,它们现在更惯用了(尽管功能相当)