如何使用BoxLayout将组件拉伸到整行?

时间:2017-05-04 08:04:49

标签: java swing boxlayout

我正在查看How To Use BoxLayout文档,其中明确指出

  

如果没有任何组件具有最大宽度,该怎么办?在这种情况下,如果   所有组件都具有相同的X对齐,然后所有组件都是   和容器一样宽。

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

enter image description here

我无法让它发挥作用!

我已尝试在按钮上执行setMaximumSize(null)和setMaximumSize(new Dimension(-1,-1))以及setMaximumSize(new Dimension(0,0)),但没有任何内容可以解释我所描述的行为。

当文件说明时,文件的含义是什么:

  

如果没有任何组件具有最大宽度怎么办?

无最大宽度是多少?

我能够生产的最好的是以下。阅读文档我希望按钮应该能够在整个行中伸展。我知道我也可以使用其他布局管理器,但我希望用BoxLayout实现这一点(授权文档是对的/我已经理解了文档权限。)

enter image description here

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

}

1 个答案:

答案 0 :(得分:2)

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

您可以做的是在循环中使用JPanel创建BorderLayout个对象,将每个按钮添加到每个面板(至BorderLayout.CENTER,这是默认值)。

BorderLayout.CENTER并不关心其子Component的最大尺寸,因此最终会得到JPanel,其全部内容由JButton填充

由于JPanel本身有一个巨大的默认最大大小new Dimension(Short.MAX_VALUE, Short.MAX_VALUE)(这是宽度= 32767,高度= 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);
}