GridBagLayout面板扩展忽略BoxLayout的垂直粘合剂

时间:2011-12-29 18:23:43

标签: java swing gridbaglayout boxlayout

在下面的示例中,我有一个带有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);
    }
}

3 个答案:

答案 0 :(得分:3)

因为anchor的{​​{1}}属性的默认值为GridBagConstraints。如果内部面板中的空间大于JLabel的首选大小,则JLabel将相对于内部面板中的可用空间居中(因为您将填充设置为NONE)。

您可以使用锚点值CENTER将标签粘贴到面板顶部:

NORTHWEST

您还需要设置每个Java文档的权重:“除非您为weightx或weighty指定至少一个非零值,否则所有组件在其容器的中心聚集在一起。这是因为当weight是0.0(默认值),GridBagLayout在其单元格网格和容器边缘之间放置任何额外的空格。

答案 1 :(得分:1)

这可能是因为GridBagLayout是一个痛苦的屁股,你应该考虑使用其他布局管理器。或者可能需要设置组件的水平和垂直对齐方式。请查看JComponentsetAlignmentXsetAlignmentY。每当我有错误的组件时,都是因为我没有对齐所有内容。

答案 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