找不到java mouseadapter源代码

时间:2010-01-31 13:35:36

标签: java swing awt mouseevent

我有一个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所以我不喜欢得不到问题所在。任何帮助将不胜感激!

1 个答案:

答案 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中的调试器很棒,你应该使用它; - )