GridBagLayout顶部和底部调整大小差距

时间:2014-03-25 10:50:21

标签: java swing gridbaglayout spacing

我有以下代码:

public Frame() {
    super();
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.BOTH;
    c.gridx = 0;
    c.weightx = 1;
    c.weighty = 1;
    for (int i = 0; i < 10; i++) {
        c.gridy = i;
        panel = new JPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
        add(panel, c);
    }
}

导致以下框架:
following

由于调整大小(预期),您可以看到顶部和底部元素上方和下方有一些空格(用箭头标记)。

任何想法如何摆脱空间或至​​少是顶部空间? 感谢

ps:我知道这个问题与我以前的问题类似,但它不一样!

1 个答案:

答案 0 :(得分:4)

问题与GridBagLayout管理额外垂直空间的方式有关,通过GridBagConstraints.weighty属性(请参阅API)。我只想引用这一行:

  

如果所有权重都为零,则所有额外空间都出现在   单元格和顶部和底部边缘

当所有权重为1(您的情况)时,也会发生同样的情况。事实上,除非第一行或最后一行(或两者)被显式设置为填充整个额外空间,否则会发生这种情况,因为布局管理器如何计算可用空间。据推测,由于可用空间和行号之间的分开,所以总是会有额外的空间未分配,并且这个空间分布在顶部(和/或)底部边缘。

如果用下一行替换循环,则整个额外空间将分布在顶行和底行中,没有任何间隙(但中间行不会占用任何额外空间):

    //c.weighty = 1; comment this line

    for (int i = 0; i < 10; i++) {
        c.gridy = i;
        c.weighty = (i == 0 || i == 9) ? 1 : 0; // add this line here
        panel = new JPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
        frame.getContentPane().add(panel, c);
    }

你可以玩这个添加的行,你会明白我的意思。

注意 :如果您想要一个分布均匀的网格,那么GridLayout可能是更好的选择。

题外话

  • 将组件添加到已显示的容器时,需要调用revalidate()方法。
  • 在使您的顶级容器可见之前,您应该始终致电pack()方法