如何使GridBagLayout遵守按钮或面板的最小尺寸?


问题内容

在下面的GridBagLayout代码中,我期望在调整JFrame的大小以使其较小时,将遵守JButton
btn2的指定最小大小。但是当我减小JFrame时,btn2变得小于其最小大小,然后消失了。

有人可以指出我做错事情的正确方向吗?也许我必须设置包含按钮的JPanel的最小大小?

任何帮助表示赞赏,谢谢!

    JFrame frame = new JFrame();
    frame.setSize(400,300);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = new JPanel();
    panel.setMinimumSize(new Dimension(400,300));
    panel.setBackground(Color.RED);

    panel.setLayout(new GridBagLayout());
    GridBagConstraints gbc = null;

    JButton btn1 = new JButton("btn1");
    btn1.setPreferredSize(new Dimension(150,50));
    btn1.setMinimumSize(new Dimension(150,50));
    gbc = new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, 
            GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
            new Insets(0,0,0,0), 0, 0);
    panel.add(btn1, gbc);

    JButton btn2 = new JButton("btn2");
    btn2.setPreferredSize(new Dimension(150,150));
    btn2.setMinimumSize(new Dimension(150,150));
    gbc = new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, 
            GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
            new Insets(0,0,100,100), 0, 0);
    panel.add(btn2, gbc);

    frame.getContentPane().add(panel);
    frame.setVisible(true);

问题答案:

也许我必须设置包含按钮的JPanel的最小大小?

AFAIR
GBL因忽略大小提示而臭名昭著。不,对此有更正。要在GBL中合理调整组件的大小,请使用GridBagConstraints适当的值。但是请注意,布局的行为不会显示任何被迫小于其最小尺寸的组件。

pack()然后,我会在框架上设置最小尺寸。这是它的外观,将最后一行更改为..

frame.pack();
frame.setVisible(true);
frame.setMinimumSize(frame.getSize());

鉴于布局,虽然,我会倾向于把btn1PAGE_STARTBorderLayout那个,然后添加到面板的LINE_START另一BL的。
btn2将进入CENTER外部BL。