GridBag 布局,定位件
GridBag Layout, positioning the pieces
我要的是左上角的标签和复选框,右下角的三个按钮。
但是,锚点似乎并没有正常工作。
结果:
代码:
JPanel bottomPanel = new JPanel( new GridBagLayout() );
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(0, 0, 0, 20);
c.anchor = GridBagConstraints.NORTHEAST;
bottomPanel.add(spinachLabel, c);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 0;
c.anchor = GridBagConstraints.NORTHEAST;
bottomPanel.add(checkbox, c);
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 5;
c.weightx = 0.5;
c.insets = new Insets(0, 0, 0, 5);
c.anchor = GridBagConstraints.SOUTHWEST;
bottomPanel.add(applyButton, c);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 5;
c.weightx = 0.5;
c.insets = new Insets(0, 0, 0, 5);
c.anchor = GridBagConstraints.SOUTHWEST;
bottomPanel.add(refreshButton, c);
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 5;
c.weightx = 0.5;
c.anchor = GridBagConstraints.SOUTHWEST;
bottomPanel.add(cancelButton, c);
return bottomPanel;
首先,我们需要阐明 GridBagConstraints.anchor 的作用:它指定组件 在 GridBagLayout 单元格中的位置。
spinachLabel 被放置在 gridx = 0。applyButton 也被放置在 gridx = 0。因此,它们保证被放置在同一列的单元格中。它们各自的锚点约束可以在它们的单元格内移动它们的位置,但不能移动单元格本身。
其次,您没有设置任何 weighty
约束。每当使用 GridBagLayout 的容器大于其子组件的首选尺寸时,它就会使用 GridBagLayout 的权重约束来决定哪些单元格将增长以占用额外的 space。当根本没有重量限制时,就像布局中垂直尺寸的情况一样,GridBagLayout 不会给任何额外 space 的单元格,而是将它们居中。这就是您所看到的:由于没有单元格设置 weighty
,因此所有单元格都垂直居中。
总而言之,您的组件永远不会出现在顶部和底部,除非您设置一些积极的 weighty
约束。
这似乎不是很好地使用 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 应该始终有文本,而不是放置在标签的右侧。这样,用户就有了更大的鼠标目标,并且您的用户界面与可访问性兼容。)
我要的是左上角的标签和复选框,右下角的三个按钮。 但是,锚点似乎并没有正常工作。
结果:
代码:
JPanel bottomPanel = new JPanel( new GridBagLayout() );
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(0, 0, 0, 20);
c.anchor = GridBagConstraints.NORTHEAST;
bottomPanel.add(spinachLabel, c);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 0;
c.anchor = GridBagConstraints.NORTHEAST;
bottomPanel.add(checkbox, c);
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 5;
c.weightx = 0.5;
c.insets = new Insets(0, 0, 0, 5);
c.anchor = GridBagConstraints.SOUTHWEST;
bottomPanel.add(applyButton, c);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 5;
c.weightx = 0.5;
c.insets = new Insets(0, 0, 0, 5);
c.anchor = GridBagConstraints.SOUTHWEST;
bottomPanel.add(refreshButton, c);
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 5;
c.weightx = 0.5;
c.anchor = GridBagConstraints.SOUTHWEST;
bottomPanel.add(cancelButton, c);
return bottomPanel;
首先,我们需要阐明 GridBagConstraints.anchor 的作用:它指定组件 在 GridBagLayout 单元格中的位置。
spinachLabel 被放置在 gridx = 0。applyButton 也被放置在 gridx = 0。因此,它们保证被放置在同一列的单元格中。它们各自的锚点约束可以在它们的单元格内移动它们的位置,但不能移动单元格本身。
其次,您没有设置任何 weighty
约束。每当使用 GridBagLayout 的容器大于其子组件的首选尺寸时,它就会使用 GridBagLayout 的权重约束来决定哪些单元格将增长以占用额外的 space。当根本没有重量限制时,就像布局中垂直尺寸的情况一样,GridBagLayout 不会给任何额外 space 的单元格,而是将它们居中。这就是您所看到的:由于没有单元格设置 weighty
,因此所有单元格都垂直居中。
总而言之,您的组件永远不会出现在顶部和底部,除非您设置一些积极的 weighty
约束。
这似乎不是很好地使用 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 应该始终有文本,而不是放置在标签的右侧。这样,用户就有了更大的鼠标目标,并且您的用户界面与可访问性兼容。)