Java GridLayout超出其大小

Java GridLayout超出其大小,java,swing,layout-manager,grid-layout,Java,Swing,Layout Manager,Grid Layout,我创建了JPanel并将布局设置为GridLayout,我将其设置为3行5列。 但是当我向这个面板添加11个jbutton时,它显示了3行,每行4列。 我希望JButtons显示在3行5列中 public class Main { public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(new GridLayout(3, 5))

我创建了
JPanel
并将布局设置为
GridLayout
,我将其设置为3行5列。 但是当我向这个面板添加11个jbutton时,它显示了3行,每行4列。 我希望JButtons显示在3行5列中

public class Main {

public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel(new GridLayout(3, 5));
        for (int i = 0; i < 11; i++) {
            JButton jButton = new JButton("Click");
            panel.add(jButton);
        }
        frame.add(panel);
        frame.setLocationByPlatform(false);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
}
}
公共类主{
公共静态void main(字符串[]args){
JFrame=新JFrame();
JPanel面板=新JPanel(新网格布局(3,5));
对于(int i=0;i<11;i++){
JButton JButton=新JButton(“单击”);
面板。添加(jButton);
}
框架。添加(面板);
frame.setLocationByPlatform(假);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

解决方案是为网格布局的其余插槽添加某种填充物。3行5列的网格布局可以包含3x5=15个组件。由于添加了11个组件,因此有4个插槽/位置为空。在这些职位上使用填充物会给你想要的结果

参见我的示例:

public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel(new GridLayout(3, 5));
        for (int i = 0; i < 11; i++) {
            JLabel label = new JLabel("something");
            label.setBorder(BorderFactory.createLineBorder(Color.green));
            panel.add(label);
        }

        for (int i = 0; i < 3 * 5 - panel.getComponentCount(); i++) {
            panel.add(Box.createRigidArea(new Dimension()));
        }
        frame.add(panel);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    });
}
publicstaticvoidmain(字符串[]args){
SwingUtilities.invokeLater(()->{
JFrame=新JFrame();
JPanel面板=新JPanel(新网格布局(3,5));
对于(int i=0;i<11;i++){
JLabel标签=新JLabel(“某物”);
label.setboorder(BorderFactory.createLineBorder(Color.green));
面板。添加(标签);
}
对于(inti=0;i<3*5-panel.getComponentCount();i++){
panel.add(Box.createRigidArea(新维度());
}
框架。添加(面板);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(真);
frame.pack();
frame.setVisible(true);
});
}
结果是:


查看添加的11个对象

新网格布局(3,5)

但是现在看看用0替换第一个参数的结果

新网格布局(0,5)

有关这方面的技巧,请参见的参数部分

参数

-行,值为零表示任意行数

cols
-列,值为零表示任意列数


同样的事情发生在4参数版本的
GridLayout
构造函数上。

谢谢,它可以工作,但我会等待更多的答案,我正在寻找一种更有效的方法来修复它,而不添加不必要的内容objects@matan说到
GridLayout
,我认为没有比这更“有效的方法”了。此外,这是在
GridLayout
中使用的常见做法。另一种方法是
GridBagLayout
@GeorgeZ。“我认为没有比这更“有效的方法”了。”当然有。有关详细信息,请参阅我的答案。你的方法是复制效果的好方法,但在这种情况下,有更简单的方法来实现它。@AndrewThompson是的。我希望“更有效的方式”得到定义。无论如何,你的答案是+1。老实说,我没有花更多的时间去寻找一个不需要填充物的解决方案。我想当然地认为,如果您在构造函数中要求3行,那么您需要3行用于将来的组件添加。但看起来,这11个组件是组件的最终数量。“我希望“更有效的方式”被定义。”是的,但我认为理想情况下可以在文档中更加明确。即使是在我的回答中加粗的部分也没有立即跳出来给我作为解决方案。这更多的是通过经验了解它是如何工作的,然后在文档中寻找解释。可能在教程中有进一步的阐述,但是。。“我没有花更多的时间试图找到一个不需要填充物的解决方案”是的。。同样地,我也懒得查看教程。无聊的。我们都必须决定如何分配我们的“时间资源”。)很遗憾,你没有听从我的建议发布MRE/SSCCE。这个问题有一个解决方案。我正在寻找一种更有效的方法来修复它,而不添加不必要的对象-是的,有一种方法可以修复它而不添加不必要的对象。但是您仍然没有发布您的演示问题的帖子,因此我们无法向您展示要更改的内容。每个问题都应该有一个MRE,这样我们就可以确切地知道您在做什么。@AndrewThompson我添加了一个最小的示例。
frame.setLocationByPlatform(false)旁白:这是默认值,但我更喜欢启用它(
setLocationByPlatform(true)
)。