GridBagLayout和JButton

问题描述

我没有找到答案,或者我听不懂并回答。我正在尝试做的是显示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,5);
add(streetLabel,gridBagConstraints);

gridBagConstraints.gridy = 0;
gridBagConstraints.gridx = 1;
gridBagConstraints.anchor = GridBagConstraints.LINE_START;
gridBagConstraints.insets = new Insets(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,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);
gridBagConstraints.anchor = GridBagConstraints.FirsT_LINE_END;
add(cancelBtn,gridBagConstraints);

不太好。

enter image description here

解决方法

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

仅当网格中有多余空间时才应用权重。它们不适用于您的表格。

此外,gridBagConstraints.gridwidth = 0;没有意义;如果网格中有东西,则不能跨越零单元格。 gridwidth和gridheight必须为正(或REMAINDERRELATIVE之类的特殊值)。

实现目标的一个好方法是在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,5);
add(buttonPanel,gridBagConstraints);

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

,

尽管可能只用一个GridBagLayout就能完成整个视图,但我还是结合了布局以简化工作。

enter image description here

  • 红色区域将是带有BorderLayout的面板。绿色和蓝色分别是CENTERPAGE_END中的面板。
  • 带有 GREEN 边框的面板将带有GridBagLayout
  • 蓝色带边框的面板将带有FlowLayout
,

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