我正在完成一本 Java 书中的 JPanel 练习。我的任务是使用 GridLayout 创建 5x4 网格。
当我循环容器以添加面板和按钮时,第一个 add() 抛出 OOB 异常。我做错了什么?
package mineField;
import java.awt.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class MineField extends JFrame {
private final int WIDTH = 250;
private final int HEIGHT = 120;
private final int MAX_ROWS = 5;
private final int MAX_COLUMNS = 4;
public MineField() {
super("Minefield");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container mineFieldGrid = getContentPane();
mineFieldGrid.setLayout(new GridLayout(MAX_ROWS, MAX_COLUMNS));
// loop through arrays, add panels, then add buttons to panels.
for (int i = 0; i < MAX_ROWS; i++) {
JPanel[] rows = new JPanel[i];
mineFieldGrid.add(rows[i], rows[i].getName());
rows[i].setBackground(Color.blue);
for (int j = 0; j < MAX_COLUMNS; j++) {
JButton[] buttons = new JButton[i];
rows[i].add(buttons[j], buttons[j].getName());
}
}
mineFieldGrid.setSize(WIDTH, HEIGHT);
mineFieldGrid.setVisible(true);
}
public int setRandomBomb(Container con)
{
int bombID;
bombID = (int) (Math.random() * con.getComponentCount());
return bombID;
}
/**
* @param args
*/
public static void main(String[] args) {
//int randomBomb;
//JButton bombLocation;
MineField minePanel = new MineField();
//minePanel[randomBomb] = minePanel.setRandomBomb(minePanel);
}
}
我确信我过度设计了一个简单的嵌套 for 循环。由于我是 Java 新手,请多多指教。我相信有一天我会报答你的恩情。
最佳答案
JPanel[] rows = new JPanel[i];
i
在第一次迭代中为 0,这不是您想要的。做到这一点:
JPanel[] rows = new JPanel[MAX_ROWS];
此外,我认为您希望将其完全放在 for
循环之外,因为您似乎正在使用它的元素,而这些元素将是未初始化的......
这也是错误的:
JButton[] 按钮 = new JButton[i];
j
为 2 时,i
可以为 0,在这种情况下,不存在 buttons[j]
这样的东西。将它们全部设置为 MAX_* ,我认为您希望将它们从循环中取出,因为我不认为在每次迭代时重新创建它们有什么意义。此外,您还需要实例化各个数组元素。
关于java 嵌套 for() 循环抛出 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2813857/