框布局不会左对齐

Box Layout Won't Align Left

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

  1. 我需要标签 ("Top Label") 和子面板 (bPanel) 在面板左侧对齐。 bPanel 在左侧对齐,但顶部标签位于中间。我该如何解决?

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

APanelbPanel 的代码如下。万一重要,APanel 被加载为 JFrame 中的 CENTER 组件设置为 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);

        }
    }
}

I need the label ("Top Label") and sub panel (bPanel) to align on the left side of the panel.

jLabel1.setHorizontalAlignment(SwingConstants.LEFT);

控制相对于容器对齐的方法错误。阅读 JLabel API。该方法用于在 JLabel 的边界内对齐文本,以防标签的大小大于文本的首选大小。

this.setAlignmentX(LEFT_ALIGNMENT);

关闭,但这不是必需的,因为 if 指的是整个面板在其父容器中的对齐方式。

相反,您需要使用垂直 BoxLayout 设置要添加到此面板的所有组件的 "alignment"。每个组件可能有不同的默认值。有些会默认为 "left",有些会默认为 "center"。

阅读 Fixing Alignment Problems 上的 Swing 教程部分了解更多信息。

How do I set the label and bPanel so they don't change in vertical size and maintain the same vertical distance between each other when the entire frame is expanded?

当额外 space 可用时,BoxLayout 将允许组件增长(达到其最大尺寸)。对于 JLabel,最大大小与其首选大小相同。对于 JPanel,最大大小是 Integer.MAX_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);