Java 盒子布局赢得';不要左对齐

Java 盒子布局赢得';不要左对齐,java,swing,layout-manager,gridbaglayout,boxlayout,Java,Swing,Layout Manager,Gridbaglayout,Boxlayout,我有一个自定义面板(APanel)。两个问题: 我需要标签(“顶部标签”)和子面板(bPanel)在面板左侧对齐 BPANT/在左侧对齐,但顶部标签位于中间。我怎么修理 如何设置标签和bPanel,以便在展开整个框架时,它们的垂直大小不会改变,并且彼此之间保持相同的垂直距离?换句话说,我如何防止以下情况发生? 下面是APanel和bPanel的代码。如有必要,APanel将作为JFrame中的中心组件加载到BorderLayout(此处不包括框架代码) 我需要标签(“顶部标签”)和子面板(bPa

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

  • 我需要标签(“顶部标签”)和子面板(
    bPanel
    )在面板左侧对齐<代码> BPANT/<代码>在左侧对齐,但顶部标签位于中间。我怎么修理

  • 如何设置标签和
    bPanel
    ,以便在展开整个框架时,它们的垂直大小不会改变,并且彼此之间保持相同的垂直距离?换句话说,我如何防止以下情况发生?

  • 下面是APanelbPanel的代码。如有必要,
    APanel
    将作为
    JFrame
    中的
    中心组件加载到
    BorderLayout
    (此处不包括框架代码)

    我需要标签(“顶部标签”)和子面板(bPanel)在面板左侧对齐

    控制与容器对齐的错误方法。阅读jlabelapi。如果标签的大小大于文本的首选大小,则该方法用于在JLabel的边界内对齐文本

    this.setAlignmentX(LEFT_ALIGNMENT);
    
    关闭,但这不是必需的,因为if在其父容器中引用了整个面板的对齐方式

    相反,您需要使用垂直
    BoxLayout
    设置要添加到此面板的所有组件的“对齐方式”。每个组件可能具有不同的默认值。有些默认为“左”,有些默认为“中”

    有关更多信息,请阅读上的Swing教程部分

    如何设置标签和bPanel,以便在展开整个框架时,它们的垂直大小不会改变,并且彼此之间保持相同的垂直距离

    当额外空间可用时,BoxLayout将允许组件增长(最大尺寸)。对于JLabel,最大大小与其首选大小相同。对于JPanel,最大大小是Integer.MAX\u value的值

    因此,您可以使用如下代码覆盖面板的
    getMaximumSize()
    方法:

    @Override
    public 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);
    

    “(此处不包括帧代码)。”要更快获得更好的帮助,请添加或。谢谢!这两个问题的解决方案都奏效了。我要向任何面临问题1的人提供的另一个注意事项是,问题不是jLabel的对齐,而是bPanel的对齐。我必须通过添加bPanel.setAlignmentX(Components.left_ALIGNMENT)将bPanel从中心更改为左对齐。仅仅更改jLabel的对齐方式并不能解决问题(事实上,默认情况下它是左对齐的)。正如camickr提供的文章所述,两个组件之间的不匹配对齐导致了奇怪的结果。
    @Override
    public 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);