如何获得GridBagLayout的尊重按钮或面板的最小尺寸?(How to get GridBag

2019-06-27 05:21发布

在下面的GridBagLayout代码,我期待的JButton BTN2的指定的最小大小时,JFrame的大小调整为更小,以得到尊重。 但是,当我做的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);

Answer 1:

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

AFAIR GBL是臭名昭著的无视大小的提示。 不,对修正。 内GBL获得部件的合理调整大小,使用GridBagConstraints用适当的值。 要小心的是,布局的行为,不显示将被迫低于其最小尺寸的任何部件。

我将pack()帧然后设置的最小尺寸的框架上。 下面是它看起来,改变最后一行..

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

鉴于布局,虽然,我会倾向于把btn1PAGE_START中的BorderLayout面板的被加入到LINE_START另一BL的。 btn2会去在CENTER外BL的。



Answer 2:

除了安德鲁·汤普森的答案:

  • 的GBL不尊重一个组件设置的最小尺寸如果组件的优选尺寸可以并且将得到遵守。
  • 的GBL DOES尊重当组件的优选的尺寸不能被尊重的组件设置的最小尺寸,即:该组件更喜欢的大小为(W,H),但GBL认为这是不可能的,因为缺少的空间,因此它倒在组件的通告最小尺寸。

因此,很可能使你的组件突然变得大于它是当你缩小含有帧之前。 你只需要设置它的最小尺寸比首选大小大。 所以,你可以将这个帧时,突然你的组件变得更大。 这是...奇怪,但可能:)所有冰雹GBL。

这里是实现这种行为(GBC是一个更简单的类比原来的GridBagConstraints使用)的面板的一个例子:

private static JPanel getPanel() {

    JPanel panel = new JPanel(new GridBagLayout());

    final JTextField textField = new JTextField("test");
    final String text = "text";
    final JLabel label = new JLabel(text);
    final JButton button = new JButton(new AbstractAction("Enlarge label!") {
        private String actText = text; 
        @Override
        public void actionPerformed(ActionEvent arg0) {
            actText = actText + text;
            label.setText(actText);
        }
    });

    GBC g;

    g = new GBC().locate(0, 0).weight(0.0, 0.0).align(GBC.WEST, GBC.HORIZONTAL, null);
    textField.setMinimumSize(new Dimension(200,20));
    panel.add(textField, g);

    g = new GBC().locate(1, 0).weight(1.0, 0.0);
    panel.add(label, g);

    g = new GBC().locate(0, 1).weight(1.0, 1.0).span(2, 1);
    panel.add(button, g);


    return panel;
}

在一般情况下,我会说,不使用必须在GBL内固定大小的组件。 包裹它用不同的布局管理器其他面板内。

如果你真的想在GBL中使用固定大小的分量,覆盖其的getPreferredSize()方法,并返回所需的大小。 但我更愿意忽略这些方法。



文章来源: How to get GridBagLayout to respect minimum size of a button or panel?