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