Java GridBagLayout顶部和底部调整间隙

Java GridBagLayout顶部和底部调整间隙,java,swing,gridbaglayout,spacing,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.grid

我有以下代码:

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);
    }
}
公共帧(){
超级();
setVisible(真);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(新的GridBagLayout());
GridBagConstraints c=新的GridBagConstraints();
c、 fill=GridBagConstraints.BOTH;
c、 gridx=0;
c、 权重x=1;
c、 权重=1;
对于(int i=0;i<10;i++){
c、 gridy=i;
panel=新的JPanel();
panel.setOrder(BorderFactory.createLineBorder(Color.RED,1));
添加(面板,c);
}
}
导致以下帧:

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

你知道如何消除这两个空白,或者至少是最上面的空白吗?
谢谢


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

问题在于如何通过属性管理额外的垂直空间(参见API)。我只想引用这句话:

如果所有权重均为零,则所有额外空间将显示在 单元格的网格和顶部和底部边缘

当所有权重都为1(您的案例)时,也会发生同样的情况。事实上,除非由于布局管理器计算可用空间的方式,第一行或最后一行(或两行)被显式设置为填充整个额外空间,否则将发生这种情况。假定由于可用空间和行数之间的剩余分割,始终存在未分配的额外空间,并且该空间分布在顶部(和/或)底部边缘

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

//c.weighty=1;评论这行
对于(int i=0;i<10;i++){
c、 gridy=i;
c、 权重=(i==0 | | i==9)?1:0;//在此处添加此行
panel=新的JPanel();
panel.setOrder(BorderFactory.createLineBorder(Color.RED,1));
frame.getContentPane().add(panel,c);
}
你可以玩这条添加的线,你会明白我的意思

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

离题
  • 将组件添加到已显示的容器时,需要调用方法
  • 在使顶级容器可见之前,应该始终调用方法

    • 问题在于如何通过属性管理额外的垂直空间(请参见API)。我只想引用这句话:

      如果所有权重均为零,则所有额外空间将显示在 单元格的网格和顶部和底部边缘

      当所有权重都为1(您的案例)时,也会发生同样的情况。事实上,除非由于布局管理器计算可用空间的方式,第一行或最后一行(或两行)被显式设置为填充整个额外空间,否则将发生这种情况。假定由于可用空间和行数之间的剩余分割,始终存在未分配的额外空间,并且该空间分布在顶部(和/或)底部边缘

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

      //c.weighty=1;评论这行
      对于(int i=0;i<10;i++){
      c、 gridy=i;
      c、 权重=(i==0 | | i==9)?1:0;//在此处添加此行
      panel=新的JPanel();
      panel.setOrder(BorderFactory.createLineBorder(Color.RED,1));
      frame.getContentPane().add(panel,c);
      }
      
      你可以玩这条添加的线,你会明白我的意思

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

      离题
      • 将组件添加到已显示的容器时,需要调用方法
      • 在使顶级容器可见之前,应该始终调用方法
          //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);
          }