Java-JFrame底部的额外像素(GridBagLayout)

Java-JFrame底部的额外像素(GridBagLayout),java,swing,gridbaglayout,Java,Swing,Gridbaglayout,我在使用GridBagLayout时遇到了一个问题,一切似乎都按预期工作,但JFrame底部有一个小缺口,我似乎无法消除 这是我正在运行的代码 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; imp

我在使用GridBagLayout时遇到了一个问题,一切似乎都按预期工作,但JFrame底部有一个小缺口,我似乎无法消除

这是我正在运行的代码

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

 private JFrame frame;
 private JPanel container, header, content, footer;

 public Test(){
     frame = new JFrame();
     frame.setSize(600, 400);
     frame.setLocationRelativeTo(null);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     GridBagConstraints gbc = new GridBagConstraints();

     container = new JPanel();
     container.setBackground(Color.blue);
     container.setLayout(new GridBagLayout());

     header = new JPanel();
     header.setBackground(Color.red);
     header.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));
     header.add(new JButton("Test"));
     gbc.gridx = 0;
     gbc.gridy = 0;
     gbc.weightx = 1.0;
     gbc.fill = GridBagConstraints.BOTH;
     container.add(header, gbc);

     content = new JPanel();
     content.setBackground(Color.green);
     gbc.gridx = 0;
     gbc.gridy = 1;
     gbc.weightx = 1.0;
     gbc.weighty = 0.9;
     gbc.fill = GridBagConstraints.BOTH;
     container.add(content, gbc);

     footer = new JPanel();
     footer.setBackground(Color.gray);
     gbc.gridx = 0;
     gbc.gridy = 2;
     gbc.weightx = 1.0;
     gbc.weighty = 0.1;
     gbc.fill = GridBagConstraints.BOTH;
     container.add(footer, gbc);

     frame.getContentPane().add(container);
     frame.setMinimumSize(new Dimension(600,400));
 }


 public static void main(String[] args) {
     Test main = new Test();
     main.frame.pack();
     main.frame.setVisible(true);

 }
}

您会注意到在UI的底部仍然显示着大约2-3个像素,容器的背景当然是蓝色的。即使在调整大小时,这种差距仍然存在。我猜这与GridBagConstraint权重有关,因为当我尝试将权重设置为相等值时,问题会自行解决,但这显然不是我希望它看起来的样子。

请看下面的示例

布局有一个属性,允许您控制由于舍入问题如何分配额外像素

基本代码可以是:

RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS);
rl.setFill( true );
rl.setRoundingPolicy(...); // or use the default
//container.setLayout(new GridBagLayout());
container.setLayout( rl );
...
//container.add(header, gbc);
container.add(header); // display at preferred size
...
//container.add(content, gbc);
container.add(content, new Float(0.9f));
...
//container.add(footer, gbc);
container.add(footer, new Float(0.1f));

这将为您提供比GridBagLayout更好的90/10关系。GridBagLayout首先分配首选空间,然后在额外空间上分配90/10,因为您没有真正的90/10关系

这实际上是
GridBagLayout
的一个已知问题(由于某种原因,我个人16年多没有遇到过),但基本上它归结为
GridBagLayout
如何计算剩余空间并舍入差,显然是计算的标准问题(例如,10/3=3 x 3,这里还保留1个像素),可以在父容器的扩展过程中进行模拟,可以通过测试SpringLayout来查看它,当您提出问题时,可以发布适当的帖子,这样人们就可以选择测试代码。您的代码应该包含类和变量。@camickr抱歉,我已经包含了完整的源代码。@samcp20,由于没有定义变量而无法编译时,这怎么可能是完整的源代码?第一次发布问题时,要努力做到准确和完整。我们没有时间继续查看您是否已纠正错误。谢谢您的建议,我会调查的。