GridBagLayout 和 JButtons

GridBagLayout and JButtons

我没有找到答案或者我不明白和回答。我想要做的是在一行中显示 2 个按钮,间隔由一个或两个空格分隔。当我使用标签和文本字段执行此操作时,它工作得很好,但使用按钮时就没那么幸运了,

gridBagConstraints.weighty = 0.1;
gridBagConstraints.weightx = 1;

gridBagConstraints.gridy = 0;
gridBagConstraints.gridx = 0;
gridBagConstraints.fill = GridBagConstraints.NONE;
gridBagConstraints.anchor = GridBagConstraints.LINE_END;
gridBagConstraints.insets = new Insets(0, 0, 0, 5);
add(streetLabel, gridBagConstraints);

gridBagConstraints.gridy = 0;
gridBagConstraints.gridx = 1;
gridBagConstraints.anchor = GridBagConstraints.LINE_START;
gridBagConstraints.insets = new Insets(0, 0, 0, 0);
add(streetField, gridBagConstraints);

效果很好!

gridBagConstraints.weighty = 2.0;
gridBagConstraints.weightx = 1;

gridBagConstraints.gridy = 4;
gridBagConstraints.gridx = 1;
gridBagConstraints.anchor = GridBagConstraints.FIRST_LINE_START;

gridBagConstraints.insets = new Insets(0 , 0, 0, 5);
add(addBtn, gridBagConstraints, 0);

gridBagConstraints.weighty = 2.0;
gridBagConstraints.weightx = 0.1;

gridBagConstraints.gridy = 4;
gridBagConstraints.gridx = 1;
gridBagConstraints.gridwidth = 0;
gridBagConstraints.insets = new Insets(0, 0, 0, 0);
gridBagConstraints.anchor = GridBagConstraints.FIRST_LINE_END;
add(cancelBtn, gridBagConstraints);

不太好。

GridBagConstraints.weighty的最大值为1。如果该值大于1,程序会将其重置为0。如果您希望该值大于0且小于1,那么您可以使用小数(即 0.5)

我建议您删除对 weightxweighty 的所有使用。他们并没有按照你的想法去做。

仅当您的网格中有 额外 space 时才适用权重。它们不适用于您的表单。

此外,gridBagConstraints.gridwidth = 0;没有意义;如果网格中有东西,它不能跨越零个单元格。 gridwidth 和 gridheight 必须为正数(或像 REMAINDER or RELATIVE 这样的特殊值)。

实现您的目标的一个好方法是在您的 GridBagLayout 中嵌套一个具有不同布局的 JPanel,它只包含您的按钮:

JPanel buttonPanel = new JPanel();
buttonPanel.add(addBtn);
buttonPanel.add(cancelBtn);

gridBagConstraints.gridy = 4;
gridBagConstraints.gridx = 0;
gridBagConstraints.gridwidth = GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = GridBagConstraints.FIRST_LINE_START;

gridBagConstraints.insets = new Insets(0, 0, 0, 5);
add(buttonPanel, gridBagConstraints);

注意使用 GridBagConstraints.REMAINDER 使面板水平跨越所有单元格。

尽管可能可以用一个 GridBagLayout 完成整个视图,但我会组合布局以简化工作。

  • RED 区域将是一个带有 BorderLayout 的面板。绿色和蓝色分别是 CENTERPAGE_END 中的面板。
  • 绿色 带边框的面板会有 GridBagLayout.
  • BLUE 边框面板会有 FlowLayout.