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 设置为相等的值时,问题自行解决,但这显然不是我想要的样子。
布局有一个 属性 允许您控制如何分配由于舍入问题引起的额外像素。
基本代码可以是:
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 关系。
我在使用 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 设置为相等的值时,问题自行解决,但这显然不是我想要的样子。
布局有一个 属性 允许您控制如何分配由于舍入问题引起的额外像素。
基本代码可以是:
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 关系。