我有一个JPanel
的数组,我正在尝试为每个添加一个鼠标适配器,这样就可以识别哪一个被点击,然后改变它的背景颜色。一切似乎工作得很好,除非我从eclipse运行它时会出现一个页面显示EventDispatchThread.run()
行:不可用,找不到源,并在调试窗口中显示:
Thread [AWT-Shutdown] (Running)
Daemon Thread [AWT-Windows] (Running)
Thread [AWT-EventQueue-0] (Suspended (exception ArrayIndexOutOfBoundsException))
EventDispatchThread.run() line: not available
Thread [DestroyJavaVM] (Running)
Thread [AWT-EventQueue-0] (Running)
这是代码:
private void drawBoard() {
LayoutManager layout = new GridLayout(NUMBER_OF_ROWS, NUMBER_OF_COLS);
boardPanel.setLayout(layout);
boardPanel.setPreferredSize(new Dimension(200, 400));
chessBoard = new JPanel[NUMBER_OF_ROWS][NUMBER_OF_COLS];
MoveArrays move = new MoveArrays();
move.initialisePieceMoves();
for (int i = 0; i < NUMBER_OF_ROWS; i++) {
for (int j = 0; j < NUMBER_OF_COLS; j++) {
int index = i * 4 + j;
chessBoard[i][j] = new JPanel();
chessBoard[i][j].addMouseListener(clickSquare(j, i, index, move));
chessBoard[i][j].setBackground(getColor(i,j));
if (!(boardArray.chessBoard[index].square.isEmpty())) {
Piece piece = (Piece) boardArray.chessBoard[index].square.firstElement();
JLabel pieceString = new JLabel(piece.toString());
chessBoard[i][j].add(pieceString);
}
boardPanel.add(chessBoard[i][j]);
}
}
} // drawBoard()
private MouseAdapter clickSquare(final int xCo, final int yCo, final int index, final MoveArrays move) {
return new MouseAdapter() {
public void mousePressed(MouseEvent me) {
resetColors();
JPanel selectedSquare = (JPanel) me.getSource();
selectedSquare.setBackground(selectedColor());
System.out.println("xCo: " + xCo + " yCo: " + yCo);
Vector validMoves = move.DroneMovesNorth[index].Moves;
int totalMoves = move.DroneTotalMovesNorth[index];
if (!validMoves.isEmpty()) {
for (int n = 0; n <= totalMoves; n++) {
String stringMove = validMoves.elementAt(n).toString();
int intMove = Integer.parseInt(stringMove);
System.out.println("intMove: " + intMove);
}
}
}
};
}
我认为可能是因为我将me.getSource转换为JPanel
但不应该是一个吗?如果我没有把演员说它不能将'对象'绑定到JPanel
,当我System.out.print(me.getSource())
时,它会打印一条线,说它是JPanel
所以我不喜欢得不到问题所在。任何帮助将不胜感激!
答案 0 :(得分:4)
问题似乎与鼠标事件的来源无关。事实上,我认为这里有两种不同的东西被称为“源”,你将它们混合在一起。我想是这样的信息:
EventDispatchThread.run() line: not available, Source not found
Eclipse是否告诉您该库没有附加源代码,因此无法找到行号或显示源代码。该问题似乎与me.getSource()
无关。
问题是你试图在数组中引用一个超出数组范围的索引(因此堆栈跟踪中的ArrayIndexOutOfBoundsException
)。
由于堆栈跟踪位于AWT事件队列线程上,因此异常可能源自mousePressed()
的{{1}}方法。由于您已经在使用Eclipse,我建议您了解调试器,这非常有用。在这些行上设一个断点:
MouseAdapter
并检查Vector validMoves = move.DroneMovesNorth[index].Moves;
int totalMoves = move.DroneTotalMovesNorth[index];
的两个数组字段是否足够大以引用索引处的元素。如果您不想使用调试器(我确实推荐这种方式),那么您可以使用异常catch来包装这两行,如下所示:
move
当/如果捕获到异常,您想要找出为什么索引大于每个数组的大小。这是一个练习; - )
编辑:那里有一些看起来很可疑的其他代码。
首先声明棋盘的数组:
try {
Vector validMoves = move.DroneMovesNorth[index].Moves;
int totalMoves = move.DroneTotalMovesNorth[index];
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Exception thrown: index = " + index +
"Array lengths: " + move.DroneMovesNorth.length + ", " +
move.DroneTotalMovesNorth.length);
}
然后你开始迭代董事会中的每个方块:
chessBoard = new JPanel[NUMBER_OF_ROWS][NUMBER_OF_COLS];
请注意,for (int i = 0; i < NUMBER_OF_ROWS; i++) {
for (int j = 0; j < NUMBER_OF_COLS; j++) {
将运行值i
,这是棋盘阵列的长度。然后由于某些原因我不明白,你将NUMBER_OF_ROWS
的值更改为可能是数组长度的4倍的值:
index
后来尝试在棋盘阵列中引用该位置:
int index = i * 4 + j;
这意味着if (!(boardArray.chessBoard[index].square.isEmpty())) {
可能是一个高于index
的值,如果您尝试访问该数组索引处的元素,它将抛出NUMBER_OF_ROWS
。
所以,我的第二个建议是再看一下所涉及的逻辑:
ArrayIndexOutOfBoundsException
......因为这也可能是问题。
P.S。 Eclipse中的调试器很棒,你应该使用它; - )