GridLayout 超出其大小

GridLayout exceeds its size

我创建了 JPanel 并将布局设置为 GridLayout,我将其设置为 3 行和 5 列。 但是当我向该面板添加 11 个 JButton 时,它每行显示 3 行 4 列。 我希望 JButton 显示在 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);
}
}

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

看我的例子:

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

结果:

添加了 11 个对象。

new GridLayout(3, 5)

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

new GridLayout(0, 5)

the constructor 参数 部分描述了这个技巧。

Parameters

rows - the rows, with the value zero meaning any number of rows.

cols - the columns, with the value zero meaning any number of columns.

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