Java 如果所有列都填满网格,则移至新行

Java Move to new row if all columns filled grid

我正在尝试制作一个动态创建的按钮列表。我正在使用 GridLayout 排列它们。我想要的是,如果按钮数量超过特定数量,如 12,则该行必须更改,即在每一行中将有 12 个按钮。

    String[] linesArray = lines.toArray(new String[DataCount]);

    setLayout(new java.awt.GridLayout(4, 4));
    for (int i = 0; i < DataCount; i++) {
        GridBagConstraints c = new GridBagConstraints();
        jPanel1.setLayout(new GridBagLayout());

        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0;
        //c.weighty = 1;
        c.gridx = 0;
        if(i > 12)
            c.gridy = 1;

        buttons[i] = new JButton(linesArray[i]);
        buttons[i].setName("iname"+i);
        buttons[i].setPreferredSize(new Dimension(100, 80));
        jPanel1.add(buttons[i], c);        

        jPanel1.setBackground(Color.WHITE);
        jPanel1.setBorder(BorderFactory.createMatteBorder(0,0,1,0,Color.BLACK));

    }

我怎样才能完成上述任务?

您似乎事先知道要创建多少个按钮,因为您要遍历 dataCount 变量并在每次迭代中创建一个新按钮。

现在您正在使用以下构造函数创建网格布局:

new java.awt.GridLayout(rows, cols)

而且您正在创建 4x4。因此,当您创建它时,只需检查您要创建的列数。例如:

int cols = dataCount > 12 ? dataCount / 12 : dataCount / 4;
int rows = (int)Math.ceil(dataCount / cols);

setLayout(new java.awt.GridLayout(rows, cols));

您可能需要检查 Math.ceil 的微调,以确保您获得足够的行和列来包含您的数据。

希望这对您有所帮助。