2010-01-31 5 views
0

J'ai un tableau de JPanel s et j'essaie d'ajouter un mouseadapter à chacun afin qu'il sera possible d'identifier celui qui a été cliqué puis de changer sa couleur de fond. Tout semble fonctionner très bien, sauf quand je le lance à partir éclipse quand une page apparaît qui dit EventDispatchThread.run() ligne: non disponible, source introuvable, et dans la fenêtre de débogage, il dit:java mouseadapter source non trouvé

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) 

Voici le code:

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); 
    } 
    } 
    } 
    }; 
} 

je pense que ce pourrait être le fait que je jetai l'me.getSource à un JPanel, mais il ne devrait pas être un de toute façon? Si je ne mets pas le cast, il dit qu'il ne peut pas lier un 'Object' à un JPanel, quand je fais System.out.print(me.getSource()) il imprime une ligne disant que c'est un JPanel donc je ne comprends pas quel est le problème. Toute aide serait très appréciée!

+0

Le moyen le plus simple d'attacher la source au runtime Java dans Eclipse est de vous assurer que votre projet utilise un JDK plutôt qu'un JRE. Vous pouvez configurer vos versions disponibles de Java dans Fenêtre-> Préférences-> Java-> JRE installés. Faire un JDK par défaut et le débogage devrait être plus facile. –

+0

Merci beaucoup: D Cela s'est débarrassé de l'erreur source introuvable! – Becky

Répondre

4

Il semble que le problème ne concerne pas la source de l'événement de la souris. En effet, je pense qu'il y a deux choses différentes qu'on appelle «source» ici, et vous les mélangez ensemble. Je pense que le message:

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

Est Eclipse vous dire que la bibliothèque ne possède pas la source Code attaché, donc il ne peut pas trouver les numéros de ligne ou vous montrer le code source. Le problème ne semble pas être avec me.getSource().

Le problème est que vous essayez de référencer un index dans un tableau qui est hors des limites du tableau (d'où le ArrayIndexOutOfBoundsException dans la trace de la pile).

Étant donné que la trace de la pile se trouve sur le thread AWT Event Queue, il est probable que l'exception provienne de la méthode mousePressed() de votre MouseAdapter. Puisque vous utilisez déjà Eclipse, je vous suggère de connaître le débogueur, ce qui est extrêmement utile. Mettez un point d'arrêt à ces lignes:

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

et vérifiez que les deux champs de tableau de move sont assez grandes pour faire référence à un élément à l'index. Si vous ne souhaitez pas utiliser le débogueur (je vraiment recommander cette façon), alors vous pouvez envelopper ces deux lignes avec une capture d'exception, comme ceci:

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); 
} 

Lorsque/si l'exception est pris, vous voulez savoir pourquoi l'indice est plus grand que la taille de chacun de ces tableaux. Ce qui reste comme un exercice ;-)


Edit: il y a un autre code qui il semble suspect.

Tout d'abord vous déclarez le tableau pour le jeu d'échecs:

chessBoard = new JPanel[NUMBER_OF_ROWS][NUMBER_OF_COLS]; 

alors vous commencez à itérer pour chaque place dans le conseil d'administration:

for (int i = 0; i < NUMBER_OF_ROWS; i++) { 
    for (int j = 0; j < NUMBER_OF_COLS; j++) { 

Notez que i se heurtera à la valeur NUMBER_OF_ROWS, qui est la longueur du tableau d'échiquier.Puis, pour une raison que je ne comprends pas, vous modifiez la valeur de index à quelque chose qui pourrait être 4x aussi grande que la longueur du tableau:

int index = i * 4 + j; 

Et essayez plus tard référence à cette position dans le tableau chessboard:

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

Cela signifie qu'il est possible index d'être une valeur supérieure à NUMBER_OF_ROWS, et si vous essayez d'accéder à l'élément à l'index du tableau, il va jeter le ArrayIndexOutOfBoundsException.

Donc, ma deuxième suggestion serait de prendre un autre regard sur la logique impliquée dans:

int index = i * 4 + j; 

... car cela pourrait aussi être le problème.

P.S. le débogueur dans Eclipse est génial, vous devriez l'utiliser ;-)

+0

Désolé si vous trouvez que ceci est nitpicking, vous avez écrit: "vous changez la valeur de i en quelque chose qui pourrait être 4x", cela devrait être "vous changez la valeur de 'index' en quelque chose qui pourrait être 4x aussi grand" – sateesh

+0

Oui, je pense que c'est du nitpicking, mais c'est le * bon type *, pas besoin de s'excuser! Merci sateesh :-) – Grundlefleck

+0

ohh la classe boardArray est juste un tableau 1d régulière lol j'essayais de convertir l'index 2d en un 1d, je voulais séparer les trucs de la logique de la logique et ai donc j'ai une version console de le jeu aussi. Merci pour la réponse si: D je vais essayer ce que vous avez dit maintenant – Becky