框布局不会向左对齐

问题描述 投票:0回答:1

我有一个自定义面板(APanel)。两个问题:

  1. 我需要标签(“顶部标签”)和子面板(bPanel)在面板的左侧对齐。 bPanel在左侧对齐,但“顶部标签”位于中间。我该如何解决? enter image description here

  2. 如何设置标签和bPanel,以使它们在扩展整个框架时不会改变垂直尺寸,并且彼此之间保持相同的垂直距离?换句话说,如何防止发生以下情况?enter image description here

APanelbPanel的代码如下。如果需要,可以将APanel作为CENTER组件加载到设置为JFrameBorderLayout中(此处不包括帧代码)。

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);

        }
    }
}
java swing layout-manager gridbaglayout boxlayout
1个回答
0
投票

我需要标签(“顶部标签”)和子面板(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 verticalBoxLayout`。每个组件可能具有不同的默认值。一些默认值为” 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);
    
© www.soinside.com 2019 - 2024. All rights reserved.