如何将 For 循环与 GridBagLayout 一起使用

How do I Use a For Loop with GridBagLayout

我想知道 java 中是否有任何方法可以使用 GridBagLayoutfor loop 放置组件放到 JFrame 上。我知道,我可以只使用 GridLayout,但我不知道如何使用 for loop 制作更大的按钮或组件。我将如何使用 GridBagLayoutfor loop 制作不同尺寸的按钮?这是我想出的,但它甚至没有打印出多行并且不起作用:

        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.weightx = 1;
        c.weighty = 1;
        for(int j = 0; j <= 2; j++) {
            c.fill = GridBagConstraints.BOTH;
            c.gridy = j;
            for(int i = 0; i < 4; i++) {
                c.gridx = i;
                panel.add(buttons.get(i), c);
            }

        }

我知道,我没有添加不同大小的按钮,但我想添加它并使当前程序运行

可以使用 GridBagLayoutfor 循环 放置组件并设置不同的大小,这是一个工作示例:

JFrame frame = new JFrame();
frame.setSize(500, 500);
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.weightx = 0.2;
c.weighty = 0.25;
for (int row = 1; row <= 3; row++) {
    c.gridy = row;
    for (int column = 1; column <= 4; column++) {
        c.gridx = column;
        c.ipadx = row * 2;
        c.ipady = row * column * 10;
        JButton button = new JButton("Button " + row + "," + column);
        panel.add(button, c);
    }
}
frame.add(panel);
frame.setVisible(true);

有关 how to use GridBagLayout 的更多信息。

您的示例代码不起作用,但与GridBagLayout无关。让我们仔细看看您的嵌套循环:

for(int j = 0; j <= 2; j++) {
    c.fill = GridBagConstraints.BOTH;
    c.gridy = j;
    for(int i = 0; i < 4; i++) {
        c.gridx = i;
        panel.add(buttons.get(i), c); // <---- Do you see the problem?
    }
}

在您的代码中查看我的评论。你大概有一个 ArrayList 里面有十二个按钮,你希望它排列成三行,每行四列,但是根据你的说法,你的代码 "doesn't even print out multiple rows."

您已将变量 i 设置为从 0 递增到 3,并且在外循环的每次迭代中,它都会随着循环重置,从 0 再次变为 3。这意味着您要将 ArrayList 中的前四个按钮添加三次,而不是将十二个按钮中的每一个添加一次。

您可以通过添加一个索引字段来解决这个问题,该字段在外循环和内循环的每次组合迭代中递增,如下所示:

int index = 0; // <---- Make sure you've declared and initialized the index

for(int j = 0; j <= 2; j++) {
    c.fill = GridBagConstraints.BOTH;
    c.gridy = j;
    for(int i = 0; i < 4; i++) {
        c.gridx = i;
        panel.add(buttons.get(index), c); // <---- This will actually do what you want
        index++; // <---- Don't forget to increment the index to get to all the buttons
    }
}

至于其余部分,您还没有指定如何更改按钮的大小,但有两种方法:

首选方法: 尝试使用 GridBagConstraints 的 gridwidthgridheightfill 字段来更改按钮的大小。

当您使用 GridBagLayout 时,想象您的容器被分成大小均匀的盒子。 gridwidthgridheight 告诉组件要使用多少个框来显示自己。 fill 告诉组件如何扩展以填充其框中的任何额外 space 如果它小于该框。

GridBagLayout 并没有为您提供您可能期望的像素完美控制,但它确实为您提供了一个排列整齐且灵活的布局。

非首选方法:使用单个组件的setPreferredSize()方法更改其大小。我提到这个技术只是因为它是可能的,但我现在必须警告你,虽然它是一种技术,但它是一种糟糕的技术。

当您使用布局管理器时,您希望让该管理器在给定您为其设置的参数的情况下尽可能多地进行控制。用户会做一些你可能没有考虑过的事情,比如将 UI 拉伸成奇怪的比例,让它填满他们的显示器,把它粉碎成很小的尺寸等等。布局管理器会自动根据变化进行调整,但是当你给它严格的规则时 "make this button exactly this many pixels wide," 你可能会遇到不希望的结果。