问题描述
我没有找到答案,或者我听不懂并回答。我正在尝试做的是显示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);
不太好。
解决方法
我建议您删除对weightx
和weighty
的所有使用。他们没有按照您的想法做。
仅当网格中有多余空间时才应用权重。它们不适用于您的表格。
此外,gridBagConstraints.gridwidth = 0;
没有意义;如果网格中有东西,则不能跨越零单元格。 gridwidth和gridheight必须为正(或REMAINDER或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,5);
add(buttonPanel,gridBagConstraints);
请注意,使用GridBagConstraints.REMAINDER
可使面板水平跨所有单元格。
尽管可能只用一个GridBagLayout
就能完成整个视图,但我还是结合了布局以简化工作。
- 红色区域将是带有
BorderLayout
的面板。绿色和蓝色分别是CENTER
和PAGE_END
中的面板。 - 带有 GREEN 边框的面板将带有
GridBagLayout
。 - 蓝色带边框的面板将带有
FlowLayout
。
GridBagConstraints.weighty
的最大值为1。如果该值大于1,则程序会将其重置为0。如果希望该值大于0且小于1,则可以使用十进制(即0.5)