如何在GridBagLayout中使用For循环

时间:2018-02-01 17:56:29

标签: java eclipse for-loop gridbaglayout

我想知道在java中是否有任何方法可以使用for loopJFrame个组件放到GridBagLayout上。我知道,我可以使用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);
            }

        }

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

2 个答案:

答案 0 :(得分:0)

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

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

GridBagLayout example

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

答案 1 :(得分:0)

您的示例代码不起作用,但它与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,里面有十二个按钮,你希望它分别排成三行,每行四列,但根据你的说法,你的代码甚至不打印多行。 &#34;

您已将变量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字段来更改按钮&#39;尺寸。

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

GridBagLayout并没有为您提供您可能期望的像素完美控制,但它给您带来的是整齐排列且灵活的布局。

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

当您使用布局管理器时,您希望让管理员根据您为其设置的参数尽可能多地进行控制。用户会做你可能没有考虑过的事情,例如将UI拉伸到奇怪的比例,让它填满显示器,将其粉碎成小尺寸或其他任何东西。布局管理器会自动调整更改,但是当你给出严格的规则时,例如&#34;使这个按钮恰好宽到这么多像素,&#34;你可能会遇到不良后果。