我正在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新手,请善待。我相信有一天我会回报你的帮助。
答案 0 :(得分:2)
这部分没有意义:
for (int j = 0; j < MAX_COLUMNS; j++) {
JButton[] buttons = new JButton[i];
rows[i].add(buttons[j], buttons[j].getName());
}
您正在创建一个i
JButton数组,并尝试将j
添加到rows
,这没有任何意义,如果j >= i
无效。你可能打算这样做:
JButton[] buttons = new JButton[MAX_COLUMNS];
for (int j = 0; j < MAX_COLUMNS; j++) {
rows[i].add(buttons[j], buttons[j].getName());
}
但是数组仍然不包含任何按钮,你所做的就是初始化它。根本没有阵列的理由;这实际上有效:
for (int j = 0; j < MAX_COLUMNS; j++) {
JButton button = new JButton("foo");
rows[i].add(button, button.getName());
}
答案 1 :(得分:2)
JPanel[] rows = new JPanel[i];
i
为0,这不是您想要的。那个:
JPanel[] rows = new JPanel[MAX_ROWS];
另外,我认为你想在for
循环之外完全采用它,因为你似乎正在使用它的未初始化的元素......
这也是错误的:
JButton[] buttons = new JButton[i];
i
为2时, j
可以为0,在这种情况下,不存在buttons[j]
这样的事情。使它们全部MAX_*
并且我认为你想把它们从循环中取出来,因为我没有看到在每次迭代中重新创建它们的重点。此外,您还需要实例化各个数组元素。
答案 2 :(得分:1)
JPanel[] rows = new JPanel[i];
当i为0时,您创建一个包含0个元素的数组。然后,您尝试访问该数组,但它中没有元素。
答案 3 :(得分:0)
问题是您的按钮阵列大小为i,但j可能大于i。例如,第一次,你在这里制作一个空数组:
JButton[] buttons = new JButton[i];
因为我等于0.然后你尝试在索引0处访问它,这不存在(因为数组没有大小)并且你得到了你的异常。你应该做的事情是:
JButton[] buttons = new JButton[MAX_COLUMNS];
这样,每个阵列位置都有一个按钮。此外,您可能需要初始化各个按钮 - 例如:
for (int k = 0; k < MAX_COLUMNS; k++) {
buttons[k] = new JButton();
}
(免责声明:代码未经过测试,但仅在示例目的的情况下退出了您的位置。可能存在拼写错误或看不见的错误。)
祝你好运。答案 4 :(得分:0)
看起来你正在创建太多数组。你是在循环中创建数组,所以不是创建5行,而是创建5行5次或25行。
另一个问题是你实际上并没有创建任何对象,只有数组来保存对象。对于数组中的每个对象,您需要另一个“button [j] = new JButton()”行。