【问题标题】:GridBagLayout top and bottom resizing gapsGridBagLayout 顶部和底部调整间隙
【发布时间】:2014-05-03 03:51:12
【问题描述】:

我有以下代码:

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);
    }
}

导致以下帧:

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

知道如何去掉两个空格,或者至少去掉顶部的空格吗?
谢谢

ps:我知道这个问题和我之前的问题很相似,但是不一样!

【问题讨论】:

    标签: java swing gridbaglayout spacing


    【解决方案1】:

    问题与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() 方法使您的顶级容器可见。

    【讨论】:

      猜你喜欢
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      相关资源
      最近更新 更多