Java 网格袋布局,定位工件

Java 网格袋布局,定位工件,java,swing,layout-manager,gridbaglayout,Java,Swing,Layout Manager,Gridbaglayout,我想要的是左上角的标签和复选框以及右下角的三个按钮。 但是,锚似乎没有正常工作 结果: 代码: 首先,我们需要澄清GridBagConstraints.anchor的作用:它指定组件在GridBagLayout单元中的位置 spinachLabel正在gridx=0处放置。applyButton也被放置在gridx=0处。因此,保证将它们放置在同一列中的单元格中。它们各自的定位约束可以移动它们在单元中的位置,但不能移动单元本身 第二,您没有设置任何重要的约束。每当使用GridBagLayout

我想要的是左上角的标签和复选框以及右下角的三个按钮。 但是,锚似乎没有正常工作

结果:

代码:


首先,我们需要澄清GridBagConstraints.anchor的作用:它指定组件在GridBagLayout单元中的位置

spinachLabel正在gridx=0处放置。applyButton也被放置在gridx=0处。因此,保证将它们放置在同一列中的单元格中。它们各自的定位约束可以移动它们在单元中的位置,但不能移动单元本身

第二,您没有设置任何重要的约束。每当使用GridBagLayout的容器大于其子组件的首选尺寸时,它都会使用GridBagLayout的权重约束来决定哪些单元格将增长以占用该额外空间。当完全没有权重约束时,就像布局中的垂直标注一样,GridBagLayout不会为任何单元格提供额外的空间,而是将其居中。这就是你所看到的:因为没有一个单元格有一个
weight
集合,所以所有的单元格都是垂直居中的

总之,您的组件永远不会出现在顶部和底部,除非您设置了一些积极的
权重约束

这似乎不是GridBagLayout的好用法。如果要在边缘放置构件,BorderLayout通常是更好的选择:

JCheckBox checkbox = new JCheckBox("Enable Spinach Study");

JButton applyButton = new JBUtton("Apply");
JButton refreshButton = new JBUtton("Refresh");
JButton cancelButton = new JBUtton("Cancel");

JComponent buttonPane = new JPanel(new FlowLayout(FlowLayout.TRAILING));
buttonPane.add(applyButton);
buttonPane.add(refreshButton);
buttonPane.add(cancelButton);

JPanel bottomPanel = new JPanel(new BorderLayout());
bottomPanel.add(checkbox, BorderLayout.PAGE_START);
bottomPanel.add(buttonPane, BorderLayout.PAGE_END);
(JCheckBox应该始终有文本,而不是放在标签的右侧。这样,用户的鼠标目标就大得多,并且您的用户界面与可访问性兼容。)

1)要更快获得更好的帮助,请发布或。2) 提供最小尺寸的ASCII艺术或GUI预期布局的简单绘图,如果可以调整大小,则具有更大的宽度和高度。3)顺便说一句,请阅读应用于帖子的标签的有用弹出窗口。网格标记在描述中明确表示不要使用它!
JCheckBox checkbox = new JCheckBox("Enable Spinach Study");

JButton applyButton = new JBUtton("Apply");
JButton refreshButton = new JBUtton("Refresh");
JButton cancelButton = new JBUtton("Cancel");

JComponent buttonPane = new JPanel(new FlowLayout(FlowLayout.TRAILING));
buttonPane.add(applyButton);
buttonPane.add(refreshButton);
buttonPane.add(cancelButton);

JPanel bottomPanel = new JPanel(new BorderLayout());
bottomPanel.add(checkbox, BorderLayout.PAGE_START);
bottomPanel.add(buttonPane, BorderLayout.PAGE_END);