我想知道在java中是否有任何方法可以使用for loop
将JFrame
个组件放到GridBagLayout
上。我知道,我可以使用GridLayout
,但我不知道如何使用for loop
制作更大的按钮或组件。如何使用GridBagLayout
和for 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);
}
}
我知道,我没有添加不同大小的按钮,但我想添加它并使当前程序正常工作
答案 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);
有关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的gridwidth
,gridheight
和fill
字段来更改按钮&#39;尺寸。
当您使用GridBagLayout
时,想象您的容器被分成大小均匀的盒子。 gridwidth
和gridheight
告诉组件有多少个框用于显示自己。 fill
告诉组件如何扩展以填充其框中的任何额外空间(如果它小于该框)。
GridBagLayout
并没有为您提供您可能期望的像素完美控制,但它给您带来的是整齐排列且灵活的布局。
非首选方法:使用单个组件的setPreferredSize()
方法更改其大小。我之所以提到这种技术只是因为它是可能的,但我现在必须警告你,虽然这是一种技术,但它是一种糟糕的技术。
当您使用布局管理器时,您希望让管理员根据您为其设置的参数尽可能多地进行控制。用户会做你可能没有考虑过的事情,例如将UI拉伸到奇怪的比例,让它填满显示器,将其粉碎成小尺寸或其他任何东西。布局管理器会自动调整更改,但是当你给出严格的规则时,例如&#34;使这个按钮恰好宽到这么多像素,&#34;你可能会遇到不良后果。