我有以下代码:
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);
}
}
导致以下框架:
由于调整大小(预期),您可以看到顶部和底部元素上方和下方有一些空格(用箭头标记)。
任何想法如何摆脱空间或至少是顶部空间? 感谢
ps:我知道这个问题与我以前的问题类似,但它不一样!
答案 0 :(得分:4)
问题与GridBagLayout管理额外垂直空间的方式有关,通过GridBagConstraints.weighty属性(请参阅API)。我只想引用这一行:
如果所有权重都为零,则所有额外空间都出现在 单元格和顶部和底部边缘。
当所有权重为1(您的情况)时,也会发生同样的情况。事实上,除非第一行或最后一行(或两者)被显式设置为填充整个额外空间,否则会发生这种情况,因为布局管理器如何计算可用空间。据推测,由于可用空间和行号之间的分开,所以总是会有额外的空间未分配,并且这个空间分布在顶部(和/或)底部边缘。
如果用下一行替换循环,则整个额外空间将分布在顶行和底行中,没有任何间隙(但中间行不会占用任何额外空间):
//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);
}
你可以玩这个添加的行,你会明白我的意思。
注意 :如果您想要一个分布均匀的网格,那么GridLayout可能是更好的选择。