如何将组件堆叠在另一个组件上以保持其垂直尺寸?

How to stack components on another so that they'd keep their vertical size?

我有一个父 JPanel,其子组件堆叠在另一个 JPanel 上。但是它们不会像我想的那样调整大小:

This is how it should be

This is what I get

代码:

public class LayoutTest extends JFrame {

public LayoutTest() {
    setVisible(true);
    setSize(new Dimension(500, 500));
    getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));

    for (int i = 0; i < 2; i++) {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(500, 50));
        panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        panel.setBackground(Color.red);
        getContentPane().add(panel);
    }

}

public static void main(String[] args) {
    LayoutTest layoutTest = new LayoutTest();
}

}

问题主要是组件在不应该的情况下垂直调整大小。我希望它们保持垂直尺寸,但它们不会。我尝试了多种布局,例如GridBagLayout、FlowLayout、BoxLayout,但其中 none 有效。

我最好的尝试是使用 BoxLayout:

简单地说:container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS); 然后 container.add(component1)...

感谢任何帮助。

camickr 的工作解决方案:

public class LayoutTest extends JFrame {

public LayoutTest() {
    setVisible(true);
    setSize(new Dimension(500, 500));
    JPanel container = new JPanel();
    container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));

    for (int i = 0; i < 2; i++) {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(500, 50));
        panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        panel.setBackground(Color.red);
        container.add(panel, BorderLayout.PAGE_START);
    }
    getContentPane().add(container, BorderLayout.NORTH);

}

public static void main(String[] args) {
    LayoutTest layoutTest = new LayoutTest();
}

}

当 space 可用时,BoxLayout 会将组件增长到最大尺寸。

当您将面板添加到框架时,不是将它添加到中心,这样面板会变大,而是将它添加到 PAGE_START 以考虑高度:

JPanel north = new JPanel();
north.setLayout( new BoxLayout(north, BoxLayout.PAGE_AXIS) );
// add loop to add panels to the "north" panel

add(north, BorderLayout.PAGE_START);

另一种解决方案是使用框布局将面板包裹到另一个面板中。

JPanel panel = new JPanel();
panel.setLayout( new BoxLayout(panel. BoxLayout.PAGE_AXIS) );
// create your loop to add child panels

JPanel wrapper = new JPanel(); // uses FlowLayout by default which respects the preferred size.
wrapper.add( panel );
frame.add( wrapper );