在下面的示例中,我有一个带有BoxLayout的JPanel,其中包含另一个带有GridBagLayout的JPanel。
通过添加垂直胶水,我希望内面板的内容“粘合”到外面板的顶部。
但我在中心看到标签“A”。如果我删除GridBagLayout,A会显示在顶部。 为什么会这样?
import javax.swing.*;
import java.awt.*;
public class Test {
public static void main(String[] args) {
JPanel contentPane = new JPanel();
JFrame frame = new JFrame();
frame.setContentPane(contentPane);
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
JPanel gridBagPanel = new JPanel();
gridBagPanel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.NONE;
gridBagPanel.add(new JLabel("A"), gbc);
contentPane.add(gridBagPanel);
contentPane.add(Box.createVerticalGlue());
frame.setSize(800, 200);
frame.setVisible(true);
}
}
答案 0 :(得分:3)
因为anchor
的{{1}}属性的默认值为GridBagConstraints
。如果内部面板中的空间大于JLabel的首选大小,则JLabel将相对于内部面板中的可用空间居中(因为您将填充设置为NONE)。
您可以使用锚点值CENTER
将标签粘贴到面板顶部:
NORTHWEST
您还需要设置每个Java文档的权重:“除非您为weightx或weighty指定至少一个非零值,否则所有组件在其容器的中心聚集在一起。这是因为当weight是0.0(默认值),GridBagLayout在其单元格网格和容器边缘之间放置任何额外的空格。“
答案 1 :(得分:1)
这可能是因为GridBagLayout
是一个痛苦的屁股,你应该考虑使用其他布局管理器。或者可能需要设置组件的水平和垂直对齐方式。请查看JComponent
的setAlignmentX
和setAlignmentY
。每当我有错误的组件时,都是因为我没有对齐所有内容。
答案 2 :(得分:0)
尽管Kavka s' Answer通过使用锚点解决了在面板顶部使用A的要求,但我相信BoxLayout面板中声明的垂直胶水实际上并没有做任何事情。因此,我将对此进行扩展,以提供我在GridBagLayouts中使用权重和垂直粘合的想法。
由于GridBagLayout是一个复杂的,可能有多个原因,但正如Kavka已经指出的那样:
weightx
和weighty
从默认值0.0修改为非零值是关键
正如Java Tutorial Documentation on GridBagConstraints中所述,JavaDoc for GridBagLayout的说明部分以及JavaDoc for GridBagConstraints中的具体参数说明。
如果所有权重都为零,则所有额外空间都出现在单元格的网格和
之间
- 对于 weightx ,左右边缘之间会额外出现空格。
- 对于重量,额外空间会出现在顶部和底部边缘之间。
因此,如果您想使用一些垂直胶水来填充空单元格,您需要确保在胶水组件上按照您希望它展开的方向给出非零重量。我将仅使用GridBagLayout,因此gridy
参数将允许我定义组件的垂直分布。
将原始代码作为示例基础并稍微扩展一下,以展示垂直胶水与重量相结合的功能。此代码将A从面板顶部定位为20%,在调整大小时保持此比率:
import javax.swing.*;
import java.awt.*;
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel gridBagPanel = new JPanel();
gridBagPanel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = 0;
gbc.weighty = 0.2;
gridBagPanel.add(Box.createVerticalGlue(), gbc);
gbc.gridy = 1;
gbc.weighty = 0;
gridBagPanel.add(new JLabel("A"), gbc);
gbc.gridy = 2;
gbc.weighty = 0.8;
gridBagPanel.add(Box.createVerticalGlue(), gbc);
frame.setContentPane(gridBagPanel);
frame.setSize(800, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
有关胶水如何工作的详细信息,请参阅Java Tutorial on How to Use BoxLayout, Filler section