2010-01-31 40 views
0

我有一个JPanel s的数组,我试图给每一个添加一个mouseadapter,以便可以识别哪个被点击,然后更改它的背景颜色。一切似乎当我从当一个页面会出现日食运行它除了做工精细说EventDispatchThread.run()行:不可用,找不到源代码,并在调试窗口,它说:java mouseadapter源未找到

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

在Eclipse中将源代码附加到Java运行时的最简单方法是确保您的项目使用JDK而不是JRE。您可以在Window-> Preferences-> Java-> Installed JRE中配置Java的可用版本。使JDK成为默认设置,调试应该更容易。 – 2010-01-31 16:06:11

+0

非常感谢:D这摆脱了源未找到错误! – Becky 2010-01-31 23:31:22

回答

4

看来问题不在于鼠标事件的来源。事实上,我认为这里有两种不同的东西被称为“来源”,并且你将它们混合在一起。我认为消息:

EventDispatchThread.run() line: not available, Source not found 

就是Eclipse告诉你的是,库没有源代码附加到它,所以它不能找到行号或显示您的源代码。该问题似乎与me.getSource()不符。

问题是,您正试图引用一个数组的边界超出数组范围的索引(因此堆栈跟踪中的ArrayIndexOutOfBoundsException)。

由于堆栈跟踪位于AWT事件队列线程上,因此可能是由方法MouseAdapter引发的异常。由于您已经在使用Eclipse,因此我建议您了解Debugger,这非常有用。将断点在这些行:

Vector validMoves = move.DroneMovesNorth[index].Moves; 
int totalMoves = move.DroneTotalMovesNorth[index]; 

并检查两个的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,这是棋盘阵列的长度。然后由于某种原因,我不明白,你的index值改变的东西,可能是4倍的数组的长度一样大:

int index = i * 4 + j; 

后来又尝试引用棋盘数组中的位置:

if (!(boardArray.chessBoard[index].square.isEmpty())) { 

这意味着它可能indexNUMBER_OF_ROWS是一个值,如果你尝试了数组的该索引来访问元素,它会抛出ArrayIndexOutOfBoundsException

所以,我的第二个建议是再看看参与的逻辑:

int index = i * 4 + j; 

...作为也可能是问题。

P.S. Eclipse中的调试器非常棒,您应该使用它;-)

+0

对不起,如果你觉得这是挑剔的,你写道: “你把我的价值改为4倍的东西”,这应该是“你改变'index'的值为4倍的价值” – sateesh 2010-01-31 14:55:03

+0

是的,我认为这是挑剔的,但它是*善良的*,不需要道歉!谢谢sateesh :-) – Grundlefleck 2010-01-31 15:39:52

+0

ohh boardArray类只是一个常规的1D数组哈哈我想将2d索引转换为1d的索引,我想将gui的东西与逻辑和ai的东西分开,所以我有一个控制台版本的游戏也是。感谢您的答案,虽然:D我会去尝试你现在说的 – Becky 2010-01-31 16:10:50