Java:JButton数组赢得';不要改变大小

Java:JButton数组赢得';不要改变大小,java,swing,size,Java,Swing,Size,嘿,我做了3个for循环来创建3个不同的jbutton数组。然后我将其放入网格布局中。左边和右边都很好,但是中间会填满面板 下面是我右边的代码: rightPanel = new JPanel(); rightPanel.setLayout(new GridLayout(12, 4, 5, 5)); rightPanel.setBorder(new EmptyBorder(10 ,10 ,10 ,10)); for (int a = 0; a <

嘿,我做了3个for循环来创建3个不同的jbutton数组。然后我将其放入网格布局中。左边和右边都很好,但是中间会填满面板

下面是我右边的代码:

        rightPanel = new JPanel();
    rightPanel.setLayout(new GridLayout(12, 4, 5, 5));
    rightPanel.setBorder(new EmptyBorder(10 ,10 ,10 ,10));


    for (int a = 0; a < 12; a++) {
        for (int b = 0; b < 4; b++) {
            battons[b][a] = new feedbackKnop.RechterKnop();
            battons[b][a].setPreferredSize(new Dimension(50, 50));
            rightPanel.add(battons[b][a]);
            battons[b][a].setEnabled(false);
        }
    }
rightPanel=newjpanel();
setLayout(新的GridLayout(12,4,5,5));
右面板.setboorder(新的EmptyBorder(10,10,10,10));
对于(int a=0;a<12;a++){
对于(int b=0;b<4;b++){
battons[b][a]=新的反馈knop.RechterKnop();
棉絮[b][a]。设置首选尺寸(新尺寸(50,50));
右面板。添加(板条[b][a]);
营[b][a]。设置启用(错误);
}
}
这是我的中心代码:

        btnPanel = new JPanel();
    btnPanel.setLayout(new GridLayout(12, 4, 5, 5));
    btnPanel.setBorder(new EmptyBorder(10 ,10 ,10 ,10));

    for (int i = 0; i < 12; i++) {
        for (int j = 0; j < 4; j++) {
            buttons[j][i] = new KleurenButton("");
            buttons[j][i].setPreferredSize(new Dimension (50, 50));
            btnPanel.add(buttons[j][i]);
            buttons[j][i].setEnabled(false);

        }

    }
btnPanel=newjpanel();
设置布局(新的网格布局(12,4,5,5));
btnPanel.setboorder(新的空订单(10,10,10,10));
对于(int i=0;i<12;i++){
对于(int j=0;j<4;j++){
按钮[j][i]=新的KleurenButton(“”);
按钮[j][i].setPreferredSize(新尺寸(50,50));
添加(按钮[j][i]);
按钮[j][i].setEnabled(假);
}
}
我希望它的大小和右边的圆圈一样

结果:


GridLayout会使所有网格的大小相同,而BorderLayout会扩展中心以填充窗口。要解决此问题,您需要强制固定窗口大小(或按特定纵横比),或者选择不自动展开其组件的其他布局。非常流行。

正如评论者所说,这是一个边界布局问题。BorderLayout有一个“贪婪”的中心面板,这意味着默认情况下,它会将其中的JComponent拉伸到整个尺寸。这与使用首选大小的边界(北、南等)不同。这就是为什么你的左右面板没有拉伸


一个简单的解决方案(不需要对布局进行剧烈更改)可能是在中心添加一个JPanel,给它一个FlowLayout,然后将您的中心网格面板添加到其中。这并不理想,但可能是一种快速创建视图原型的方法。

三个面板使用的布局管理器是什么。看起来像是
BorderLayout
是的BorderLayout@Glenndisimo
BorderLayout
始终为边框提供最小空间,为中心提供剩余空间。这是
BorderLayout
的默认行为,它将忽略中心组件的首选大小(或多或少),并使其填充可用空间。如果希望面板均匀布置,则使用1行3列将其更改为类似于
GridLayout
。若要使用每个组件的首选大小,也可以使用
GridBagLayout
。我强烈建议不要使用
setPreferredSize
和override
getPreferredSize
代替。谢谢!我不知道默认的行为。现在,如果我使用GridLayout,它看起来真的很奇怪(左边是4x12,中间是一个大圆圈,旁边是4x12(最后一部分是正确的)),你知道吗?