2010-01-31 4 views
0

배열이 JPanel입니다. 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으로 캐스팅했으나 어쨌든 하나가 아니어야한다고 생각합니다. 캐스트를 넣지 않으면 'Object'를 JPanel에 바인딩 할 수 없다고 말하면 System.out.print(me.getSource())을 입력하면 JPanel이라는 줄이 인쇄되므로 문제가 발생하지 않습니다. 어떤 도움을 많이 주시면 감사하겠습니다!

+0

Eclipse에서 Java 런타임에 소스를 첨부하는 가장 쉬운 방법은 프로젝트에서 JRE 대신 JDK를 사용하는지 확인하는 것입니다. Window -> Preferences -> Java -> Installed JRE에서 사용 가능한 Java 버전을 구성 할 수 있습니다. JDK를 기본값으로 만들고 디버깅이 쉬워야합니다. –

+0

Thanks a lot : D 이것은 소스를 찾을 수 없다는 오류를 없앴습니다! – Becky

답변

4

문제는 마우스 이벤트의 소스와 관련이없는 것으로 보입니다. 실제로 저는 여기에 "소스"라고 불리는 두 가지 다른 것들이 있다고 생각합니다.

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

라이브러리 소스 코드가 부착되어 있지 않기 때문에이 줄 번호를 찾거나 당신에게 소스 코드를 표시 할 수 없습니다 있음을 알려주는 이클립스가 : 나는 메시지를 생각한다. 문제가 me.getSource() 인 것으로 보입니다.

배열의 범위를 벗어나는 인덱스 (즉, 스택 추적의 ArrayIndexOutOfBoundsException)를 참조하려고하는 것이 문제입니다.

스택 추적이 AWT 이벤트 큐 스레드에 있기 때문에 MouseAdapter의 메서드에서 예외가 발생했을 수 있습니다. 이미 이클립스를 사용하고 있으므로 디버거에 대해 알면 매우 유용합니다.

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까지 실행됩니다, 이것은 체스 판 배열의 길이입니다.체스 판 배열에서 그 위치를 참조하려고 나중에

int index = i * 4 + j; 

그리고 : 그럼 난 이해하지 못하는 어떤 이유로, 당신은 배열의 길이만큼 큰 배 할 수있는 일에 index의 값을 변경 :

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

indexNUMBER_OF_ROWS보다 값이 높은하는 것이 가능 의미하며, 당신이 배열의 인덱스에있는 요소에 액세스하려고하면, 그것은 ArrayIndexOutOfBoundsException 발생합니다.

그래서, 내 두 번째 제안에 포함 된 논리에서 다른 모습을 가지고하는 것입니다 :

int index = i * 4 + j; 

을 ... 그 또한 문제가 될 수있다.

P. Eclipse의 디버거는 멋져요 .-

+0

죄송합니다.이 nitpicking 찾으십시오 경우 : "당신은 4x 수있는 뭔가를 내가 변경할 수있는"값을 변경해야합니다 "큰 값으로 4x 수있는 뭔가 'index'값을 변경해야합니다" – sateesh

+0

그래, 나는 그것이 nitpicking라고 생각한다. 그러나 그것은 좋은 종류 다, 사과 할 아무 필요도 없다! 감사합니다 :-) – Grundlefleck

+0

ohh boardArray 클래스는 2 차원 색인을 1 차원으로 변환하려고 시도한 일반 1 차원 배열입니다. 논리와 인공 지능으로부터 gui 요소를 분리하고 싶었습니다. 그래서 콘솔 버전이 있습니다. 게임도. 대답 주셔서 감사합니다 : D 조 내가 갈거야 당신이 지금 말한 것을 시도해 보겠습니다. – Becky

관련 문제