我正在尽我所能在我的面板周围移动我的文本字段和标签,以使它们处于良好的位置,因此它看起来很整洁。我想要我的标签,就在我的文本字段旁边。
但是,我只能通过改变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);
如果我可以通过改变一行代码甚至一个数字来移动标签和文本字段,那将是理想的。我怎样才能实现这一点,或类似的东西。
感谢您的帮助。
答案 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的自动功能。但为什么要让它变得比它需要的更难?