GridBagLayout组件显示不正确的宽度

时间:2014-12-05 02:03:24

标签: java swing user-interface gridbaglayout

我似乎遗漏了一些关于GridBagLayout的基本内容。我试图指定标签应该是2个单位宽,文本字段应该是10个单位宽。

以下代码模仿了我正在做的事情的一部分。它显示文本字段和标签占用大约相同的宽度。我错过了什么或做错了什么?

package numbers;

import javax.swing.*;
import java.awt.*;

public class FooBar extends JFrame {
    public static void main(String[] args) {
        new FooBar();
    }
    FooBar() {
        super("Foobar");
        setSize(600,100);

        JPanel panel = new JPanel();
        setLayout(new GridBagLayout());

        JLabel nLabel = new JLabel("Foo");
        JTextField nTextField = new JTextField("Bar");

        GridBagConstraints c = new GridBagConstraints();

        add(nLabel,         cs(0,  0,  2, 1, c.CENTER, c.NONE));
        add(nTextField,     cs(2,  0, 10, 1, c.CENTER, c.HORIZONTAL));

        add(panel);
        setVisible(true);
    }

    private GridBagConstraints cs(int gridx, int gridy,
            int gridwidth, int gridheight,
            int anchor, int fill) {
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = gridx;
        c.gridy = gridy;
        c.gridwidth = gridwidth;
        c.gridheight = gridheight;
        c.anchor = anchor;
        c.fill = fill;

        c.weightx = 1;
        c.weighty = 1;
        return c;
    }
}

我以为我已经指定nLabel的网格宽度是2,并且nTextField的网格宽度是10.我认为这些列的宽度大约相同,它们具有相同的权重x。那么,为什么组件的宽度相同呢?为什么列显然有不同的尺寸?

更新

添加weightx = 2和weightx = 10似乎可以修复此代码段...但它并不适用于更大的上下文。我使用的代码看起来像这样:

    add(intro1,         cs(0,  0, 12, 1, c.WEST,    c.NONE));
    add(intro2,         cs(0,  1, 12, 1, c.WEST,    c.NONE));
    add(nLabel,         cs(0,  3,  2, 1, c.CENTER,  c.NONE));
    add(nTextField,     cs(2,  3, 10, 1, c.CENTER,  c.HORIZONTAL));
    add(nthFoundLabel,  cs(0,  4,  3, 1, c.CENTER,  c.NONE));
    add(nFoundText,     cs(2,  4, 10, 1, c.CENTER,  c.HORIZONTAL));
    add(blankLine,      cs(0,  5, 12, 1, c.CENTER,  c.HORIZONTAL));
    add(startButton,    cs(0,  6,  6, 1, c.CENTER,  c.NONE));
    add(stopButton,     cs(6,  6,  6, 1, c.CENTER,  c.NONE));
    add(blankLine,      cs(0,  7, 12, 1, c.CENTER,  c.BOTH));
    add(progressLabel,  cs(0,  8, 12, 1, c.CENTER,  c.NONE));
    add(lastFoundLabel, cs(0,  9,  3, 1, c.CENTER,  c.NONE));
    add(lastFoundText,  cs(3,  9,  9, 1, c.CENTER,  c.HORIZONTAL));
    add(lastNText,      cs(3, 10,  9, 1, c.CENTER,  c.HORIZONTAL));
    add(elapsedLabel,   cs(0, 11,  3, 1, c.CENTER,  c.HORIZONTAL));
    add(remainingLabel, cs(0, 12,  3, 1, c.CENTER,  c.HORIZONTAL));
    add(progressBar,    cs(0, 13, 12, 1, c.CENTER,  c.HORIZONTAL));

我认为可以通过添加weightx = gridwidth;更改辅助方法cs来解决此问题,但这仍然无法解决问题。到底是怎么回事?

1 个答案:

答案 0 :(得分:2)

每个子组件的容器宽度分布由weightx确定。您分配给gridwidth的值应该分配给weightx。所有组件的网格宽度应为1(或REMAINDER)。

gridwidth和gridheight不会更改组件布局的大小。特别是,gridwidth = 2的组件是gridwidth = 1的组件的两倍宽。

尽管名称中有“Grid”字样,但GridBagLayout的单元格大小并不相同;它们只是在一起。如果您绘制线条来显示每个单元格,GridBagLayout可能如下所示:

             _________________________________
            |         |               |       |
 (gridy=0)  | gridx=1 |    gridx=2    |gridx=3|
            |_________|_______________|_______|
            |         |               |       |
            |         |               |       |
 (gridy=1)  | gridx=1 |    gridx=2    |gridx=3|
            |         |               |       |
            |_________|_______________|_______|

gridwidth / gridheight确定组件占用了多少GridBagLayout的单元格。如果将gridwidth = 2与组件关联,但在任一网格列中没有其他组件,则效果将与gridwidth = 1相同,因为没有其他组件驱动列的宽度。即使gridwidth = 2分量是两个单元格宽,这两个单元格仍然只有足够的总宽度来布局,以适应组件的首选大小。