Java GridBagConstraints

时间:2013-04-12 20:57:33

标签: java swing gridbaglayout

我在JPanel中有5个组件。 我添加了前4个组件,一切看起来都很顺畅。 但是,当我尝试向JPanel添加第5个组件时,组件之间的间距会因任何原因而改变!

没有第五部分:

First Name: [..............]

Last Name: [..............]

使用:

First Name:---------------- [.............]

Last Name:----------------- [.............]

What is your favorite sport:

假设标签和文本字段之间的破折号为空格

标签和文本字段之间的间距发生变化! 这是我的代码,请帮帮我!

    public static void main(String[] args)
{
    JFrame frame = new JFrame("Survey");
    frame.setSize(800, 600);
    frame.setLayout(new FlowLayout(FlowLayout.CENTER));
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel p1 = new JPanel(new GridBagLayout());
    //LINE.START = Top Left Corner
    frame.add(p1);

    GridBagConstraints gbc = new GridBagConstraints();
    gbc.insets = new Insets(5, 5, 10, 10);

    JLabel lblFirstN = new JLabel("First Name:");
    JLabel lblLastN = new JLabel("Last Name:");
    JLabel lblFavSport = new JLabel("What is your favorite sport:");

    JTextField txtFirstN = new JTextField();
    txtFirstN.setPreferredSize(new Dimension(100, 20));

    JTextField txtLastN = new JTextField();
    txtLastN.setPreferredSize(new Dimension(100, 20));

    gbc.gridx = 0;
    gbc.gridy = 0;
    p1.add(lblFirstN, gbc);

    gbc.gridx = 1;
    gbc.gridy = 0;
    p1.add(txtFirstN, gbc);

    gbc.gridx = 0;
    gbc.gridy = 1;
    p1.add(lblLastN, gbc);

    gbc.gridx = 1;
    gbc.gridy = 1;
    p1.add(txtLastN, gbc);

    //this block of code is what is screwing me
    gbc.gridx = 0;
    gbc.gridy = 2;
    p1.add(lblFavSport, gbc);
}

2 个答案:

答案 0 :(得分:3)

获得此输出的原因是,这就是布局管理器的设计方式。

GridBagLayoutGridLayout的(虚拟)扩展。事实上,它将它的组件放在网格中,但比GridLayout更灵活。关闭您将在包含的布局管理器中获得类似HTML表的内容。

让我们仔细看看。以下代码......

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("First Name"), gbc);
gbc.gridy++;
add(new JLabel("Last Name"), gbc);

gbc.gridx = 1;
gbc.gridy = 0;
add(new JTextField(15), gbc);
gbc.gridy++;
add(new JTextField(15), gbc);

生成

enter image description here

显然,您可以看到行和列。每行具有相同的高度,每列具有相同的宽度......

现在,如果我们添加下一个标签和字段......

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("First Name"), gbc);
gbc.gridy++;
add(new JLabel("Last Name"), gbc);
gbc.gridy++;
add(new JLabel("What is your favorite sport:"), gbc);

gbc.gridx = 1;
gbc.gridy = 0;
add(new JTextField(15), gbc);
gbc.gridy++;
add(new JTextField(15), gbc);
gbc.gridy++;
add(new JTextField(15), gbc);

这是你目前的问题......

enter image description here

您可以看到第一列的宽度已增加以容纳新标签...

现在我们可以使用gridWidth ...

来解决这个问题
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("First Name"), gbc);
gbc.gridy++;
add(new JLabel("Last Name"), gbc);
gbc.gridy++;
gbc.gridwidth = 2;
add(new JLabel("What is your favorite sport:"), gbc);

gbc.gridwidth = 1;
gbc.gridx = 1;
gbc.gridy = 0;
add(new JTextField(15), gbc);
gbc.gridy++;
add(new JTextField(15), gbc);
gbc.gridx = 2;
gbc.gridy++;
add(new JTextField(15), gbc);

nb:最后一个字段gridx位置必须增加,否则它实际上会超过标签!

enter image description here

现在,那更好,但是,我认为这不是你想要的:P

我们需要调整前两个字段以跨越下一个单元格...

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("First Name"), gbc);
gbc.gridy++;
add(new JLabel("Last Name"), gbc);
gbc.gridy++;
gbc.gridwidth = 2;
add(new JLabel("What is your favorite sport:"), gbc);

gbc.gridwidth = 2;
gbc.gridx = 1;
gbc.gridy = 0;
add(new JTextField(15), gbc);
gbc.gridy++;
add(new JTextField(15), gbc);
gbc.gridx = 2;
gbc.gridy++;
add(new JTextField(15), gbc);

enter image description here

最后:P - 简单就像馅饼:D

您可能需要仔细查看How to use GridBagLayout了解更多详情......

答案 1 :(得分:1)

最后一个JLabel未与前一个标记对齐的原因是所有标签都居中对齐并显示在同一列中。当只有2个标签时,由于它们FontMetric宽度相等的快乐巧合,它们看起来是对齐的。添加第三个,标签显示交错。

要修复,您可以通过将组件锚定到GridBagConstraints.WEST并沿x轴设置权重来锚定标签以抵消此效果:

gbc.weightx = 1;
gbc.anchor = GridBagConstraints.WEST;

这具有左对齐组件在其GridBagLayout“单元格内的效果”。