网格袋布局顶部和底部调整间隙

3

我有以下代码:

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个回答

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()方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接