如何使用 BoxLayout 让组件延伸到整行?

How can get components to stretch across an entire row using BoxLayout?

我正在查看 How To Use BoxLayout 文档,其中清楚地说明了

What if none of the components has a maximum width? In this case, if all the components have identical X alignment, then all components are made as wide as their container.

假设我们要向 JPanel 添加很多 JButton 个实例。如果这些按钮的最大宽度是 none 并且我们在所有这些按钮上调用 setAlignmentX(Component.LEFT_ALIGNMENT) - 那么这些按钮中的每一个都应该横跨其整行。文档甚至使用下图说明了这一点。

我无法让它工作!

我试过在按钮上执行 setMaximumSize(null) 和 setMaximumSize(new Dimension(-1,-1))setMaximumSize(new Dimension(0,0)),但没有给我描述的行为。

文档中的确切含义是什么:

What if none of the components has a maximum width?

none的最大宽度是多少?


我能制作的最好的是下面的。阅读文档我希望按钮应该能够跨越它们的整行。我知道我也可以为此使用其他布局管理器,但我想用 BoxLayout 来实现这一点(假设文档是正确的/我理解文档是正确的)。

public class CustomList extends JPanel {

    private final Box box = Box.createVerticalBox();

    public CustomList() {
        for (int i = 0; i < 10; i++) {
            JButton b = new JButton("Button item" + i);
            //b.setMaximumSize(new Dimension(0,0));
            b.setAlignmentX(Component.LEFT_ALIGNMENT);
            box.add(b);
        }
        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
        add(box, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        CustomList l = new CustomList();
        l.setSize(200, 200);
        l.setBackground(Color.red);

        JFrame frame = new JFrame("Vertical Box");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(l, BorderLayout.CENTER);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }

}

您的按钮实际上有最大宽度。

你可以做的是在你的循环中创建 JPanel 个带有 BorderLayout 的对象,将每个按钮添加到每个面板(添加到 BorderLayout.CENTER,这是默认设置)。

BorderLayout.CENTER 不关心其子 Component 的最大大小,因此您最终得到一个 JPanel,其全部内容由 JButton 填充.

因为 JPanel 本身有一个巨大的默认最大尺寸 new Dimension(Short.MAX_VALUE, Short.MAX_VALUE) (这是 width=32767,height=32767 !!)这是 Component 的默认最大尺寸,你会得到预期的结果:

public CustomList() {
    for (int i = 0; i < 10; i++) {

        JPanel panel = new JPanel(new BorderLayout());
        JButton b = new JButton("Button item" + i);
        //b.setMaximumSize(new Dimension(0,0));
        b.setAlignmentX(Component.LEFT_ALIGNMENT);
        panel.add(b);
        box.add(panel);
    }
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
    add(box, BorderLayout.CENTER);
}