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)
我建议您删除对 weightx
和 weighty
的所有使用。他们并没有按照你的想法去做。
仅当您的网格中有 额外 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
的面板。绿色和蓝色分别是 CENTER
和 PAGE_END
中的面板。
- 绿色 带边框的面板会有
GridBagLayout
.
- BLUE 边框面板会有
FlowLayout
.
我没有找到答案或者我不明白和回答。我想要做的是在一行中显示 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)
我建议您删除对 weightx
和 weighty
的所有使用。他们并没有按照你的想法去做。
仅当您的网格中有 额外 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
的面板。绿色和蓝色分别是CENTER
和PAGE_END
中的面板。 - 绿色 带边框的面板会有
GridBagLayout
. - BLUE 边框面板会有
FlowLayout
.