首页 > 解决方案 > 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, 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);

不太好。

在此处输入图像描述

标签: javaswinglayout-managergridbaglayout

解决方案


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

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

另外,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使面板水平跨越所有单元格。


推荐阅读