首页 文章

GridbagLayout似乎忽略了组件大小

提问于
浏览
1

我是第一次使用 GridBagLayout . 我有一个 JFrame ,里面有2个面板 .

  • 框架的宽度为1200,高度为800 .

  • 最左边 JPanel 的宽度为800,高度为800 .

  • 最右边的面板宽度为400,高度为800 .

当他们使用_2454650渲染时,它们都以相同的大小显示 .

这是代码:

public class DisplayFrame extends JFrame {
    public DisplayFrame() {

            //simple inheritance. 
            super(title);
            setSize(new Dimension(1200, 800));
            setResizable(false);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);

            addComponents();

        } 

        public void addComponents(){

            this.setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();

            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.fill = GridBagConstraints.BOTH;
            add(new DisplayCanvas(), gbc);

            gbc.gridx++;
            add(new ControlContainer(), gbc);

        }
    }

public class DisplayCanvas extends JPanel{

    public DisplayCanvas() {

        setPreferredSize(new Dimension(800,800));
        this.setBackground(Color.WHITE);
        this.setVisible(true);

    }

     @Override
     public Dimension getPreferredSize() {
         return new Dimension(800, 800);
     }

}
public class ControlContainer extends JPanel{

    public ControlContainer() {
        setPreferredSize(new Dimension(200,200));
        setBackground(Color.GRAY);
        setVisible(true);

    }

 @Override
     public Dimension getPreferredSize() {
         return new Dimension(400, 800);
     }
}

毫无疑问,我错过了很明显的东西 .

1 回答

  • 2

    gbc.weightx = 1;gbc.weighty = 1; 正在覆盖组件提供的大小调整提示 . 这基本上为两个组件提供相同的权重,以填补 GridBagLayout 可用的剩余空间

    不要单独依赖尺寸提示,因为窗口可以调整大小 .

    另外,请记住,一个框架有装饰,所以框架赢得了1200x800 . 允许内容提供有关所需内容的信息,并使用 pack 确保可视区域满足您的需求并且框架装饰围绕它 . 这将使您的窗口大小最终大于内容区域,但内容区域是重要的

相关问题