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

Java - Extra pixels at the bottom of JFrame (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;
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 权重有关,因为当我尝试将 weightY 设置为相等的值时,问题自行解决,但这显然不是我想要的样子。

看看Relative Layout

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

基本代码可以是:

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 首先分配首选 space,然后在额外的 space 上分配 90/10,因为您没有真正的 90/10 关系。