【问题标题】:GridBagLayout and JButtonsGridBagLayout 和 JButton
【发布时间】:2021-01-29 09:42:21
【问题描述】:

我还没有找到答案,或者我没有理解和回答。我正在尝试做的是显示 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);

不太好。

【问题讨论】:

  • 谢谢大家的回复

标签: java swing layout-manager gridbaglayout


【解决方案1】:

我建议您删除所有使用 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, 0, 0, 5);
add(buttonPanel, gridBagConstraints);

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

【讨论】:

    【解决方案2】:

    虽然可能使用单个 GridBagLayout 完成整个视图,但我会结合布局以简化工作。

    • RED 区域将是一个带有BorderLayout 的面板。 GREEN 和 BLUE 分别是 CENTERPAGE_END 中的面板。
    • 带有 GREEN 边框的面板将具有 GridBagLayout
    • BLUE 边框面板将有一个FlowLayout

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这完全是错误的。权重可以是任何非负值。任何单个轴上的权重都被假定为彼此成比例。并且非零权重永远不会被强制为零。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      相关资源
      最近更新 更多