BoxLayout 面板内的项目不占用 JPanel 的宽度

Item inside BoxLayout panel not occupying width of JPanel

下面的面板有BoxLayout,底部的按钮不占面板的宽度,而是左右两侧有空隙。

    JPanel panel = new JPanel();
    BoxLayout boxlayout = new BoxLayout(panel, BoxLayout.Y_AXIS);
    panel.setLayout(boxlayout);

    JPanel framesPanel[] = new JPanel[8];
    
    for(int i=0;i<8;i++) {
        framesPanel[i] = new JPanel();
        framesPanel[i].setLayout(new BoxLayout(framesPanel[i], BoxLayout.X_AXIS));

        JButton jb1 = new JButton("Button 1");
        jb1.setAlignmentX(Component.LEFT_ALIGNMENT);
        JButton jb2 = new JButton("Button 2");
        jb2.setAlignmentX(Component.LEFT_ALIGNMENT);

        JButton jb3 = null;

        framesPanel[i].add(jb1);
        framesPanel[i].add(jb2);

        if (i < 6) {
            jb3 = new JButton("Button 3");
            jb3.setAlignmentX(Component.LEFT_ALIGNMENT);
            framesPanel[i].add(jb3);
        }
        panel.add(framesPanel[i]);
    }


    // Set size for the frame
    panel.setSize(300, 300);
    frame.setSize(300, 300);

    // Set the window to be visible as the default to be false
    frame.add(panel);

我试过 setAlignmentX(Component.LEFT_ALIGNMENT) 但这似乎没有任何效果。

A BoxLayout 遵守组件的最大尺寸。

按钮的最大尺寸与其首选尺寸相同。

创建按钮时,您可以执行以下操作:

JButton button = new JButton(...);
Dimension maximum = button.getMaximumSize();
maximum.width = Integer.MAX_VALUE;
button.setMaximumSize( maximum );

注:

这只是一个快速修复,如果您从不更改按钮的字体大小,它就会起作用。对于一个合适的解决方案,你真的应该创建一个自定义按钮来扩展 JButton 并将 getMaximumSize() 方法重写为 return 以上大小。如果动态更改按钮的属性,这将起作用。