我有一个自定义面板(APanel
)。两个问题:
我需要标签(“顶部标签”)和子面板(bPanel
)在面板的左侧对齐。 bPanel
在左侧对齐,但“顶部标签”位于中间。我该如何解决?
如何设置标签和bPanel
,以使它们在扩展整个框架时不会改变垂直尺寸,并且彼此之间保持相同的垂直距离?换句话说,如何防止发生以下情况?
APanel
和bPanel
的代码如下。如果需要,可以将APanel
作为CENTER
组件加载到设置为JFrame
的BorderLayout
中(此处不包括帧代码)。
public class APanel extends JPanel {
private JLabel jLabel1;
private BPanel bPanel;
public APanel () {
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
jLabel1 = new JLabel("Top Label", JLabel.LEFT);
jLabel1.setHorizontalAlignment(SwingConstants.LEFT);
jLabel1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
add(jLabel1);
bPanel = new BPanel();
bPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
add(bPanel);
this.setAlignmentX(LEFT_ALIGNMENT);
}
private class bPanel extends JPanel {
private JLabel sLabel;
private JLabel tLabel;
public bPanel() {
sLabel = new JLabel("Jeepers");
tLabel = new JLabel("Creepers");
setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.gridx = 0;
gc.gridy = 0;
gc.weightx = 1;
gc.weighty = 1;
gc.fill = GridBagConstraints.HORIZONTAL;
add(sLabel, gc);
gc.gridx = 1;
add(tLabel, gc);
}
}
}
我需要标签(“顶部标签”)和子面板(bPanel)在面板的左侧对齐。
jLabel1.setHorizontalAlignment(SwingConstants.LEFT);
错误的方法来控制相对于容器的对齐方式。阅读JLabel API。如果标签的大小大于文本的首选大小,则可以使用该方法在JLabel的边界内对齐文本。
this.setAlignmentX(LEFT_ALIGNMENT);
关闭,但这不是必需的,因为if表示整个面板在其父容器中的对齐方式。
相反,您需要设置“ alignmentXof all the components you are adding the this panel using the vertical
BoxLayout`。每个组件可能具有不同的默认值。一些默认值为” left“,有些默认为” center“。
阅读有关Fixing Alignment Problems的Swing教程的部分,以了解更多信息。>>
我如何设置标签和bPanel,以使它们在垂直方向上的大小不变,并且在扩展整个框架时彼此之间保持相同的垂直距离?
BoxLayout将允许组件在有额外空间可用时增长(达到其最大大小)。对于JLabel,最大大小与其首选大小相同。对于JPanel,最大大小为Integer.MAX_VALUE的值。
因此您可以使用类似以下代码的方式覆盖面板的getMaximumSize()
方法:
@ Overridep
ublic Dimension getMaximumSize() { Dimension preferred = getPreferredSize(); Dimension maximum = super.getMaximumSize(); maximum.height = preferred.height; return maximum; }
或另一个选择是将面板包装在另一个尊重高度的面板中。例如。
JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(bPanel, BorderLayout.PAGE_START);
add(wrapper);
//add(bPanel);