如何使用GridBagLayout将标签和文本字段链接在一起?

时间:2016-10-31 11:44:58

标签: java grid-layout gridbaglayout

我正在尽我所能在我的面板周围移动我的文本字段和标签,以使它们处于良好的位置,因此它看起来很整洁。我想要我的标签,就在我的文本字段旁边。

但是,我只能通过改变GridBagConstraints.gridx / gridy来实现这一点,即便如此,我仍然无法将它们并排放置,这真让我感到沮丧。

是否有任何代码可以将这两个组件并排连接而无需始终更改gridx / gridy数字?

这是我的代码:

            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.insets = new Insets(4, 4, 4, 4);
            gbc.gridy--;
            add(new JLabel("Serial: "), gbc);
            //gbc.gridy--;
            add(new JLabel("Location: "), gbc);

            gbc.gridx = 10;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.EAST;
            gbc.fill = GridBagConstraints.BOTH;
            add(new JTextField(10), gbc);
            gbc.gridy++;
            add(new JTextField(10), gbc);

如果我可以通过改变一行代码甚至一个数字来移动标签和文本字段,那将是理想的。我怎样才能实现这一点,或类似的东西。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

标签/字段用例非常常见。编写代码的最简单方法是利用GridBagConstraints.RELATIVE,它恰好是gridx和gridy的默认值,以及GridBagConstraints.REMAINDER。

当gridx和gridy都是GridBagConstraints.RELATIVE时,添加的组件放在同一行上,好像gridx正在递增而gridy没有改变 - 但是,如果gridwidth是GridBagConstraints.REMAINDER,那么 next 添加的组件将被放置在一个新行上,假设gridx和gridy仍然是RELATIVE。

JTextField serialField = new JTextField(10);
JTextField locationField = new JTextField(10);

JLabel serialLabel = new JLabel("Serial: ");
serialLabel.setLabelFor(serialField);

JLabel locationLabel = new JLabel("Location: ");
locationLabel.setLabelFor(locationField);

GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.BASELINE_LEADING;
gbc.insets = new Insets(4, 4, 4, 4);

gbc.gridwidth = 1;
add(serialLabel, gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(serialField, gbc);

gbc.gridwidth = 1;
add(locationLabel, gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(locationField, gbc);

gbc.gridwidth = GridBagConstraints.REMAINDER;行告诉GridBagLayout“这个组件应该被视为该行的最后一个”(而gridx和gridy是RELATIVE)。

当然,如果将gridx和gridy设置为实际(非负)数字,则将覆盖RELATIVE和REMAINDER的自动功能。但为什么要让它变得比它需要的更难?