2012-04-18 2 views
1

임지고 "예외 스레드에서"AWT-EventQueue의-0 "java.lang.ArrayIndexOutOfBoundsException :. 0 내가 정말 이유를 이해 해달라고이는 ArrayIndexOutOfBoundsException를 생산

난 리스너로 사용할 두 내부 클래스를 JPanel과에 대한 bildYta 전화 :

private class NyPlatsLyss implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
     bildYta.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); 
     bildYta.addMouseListener(new BildYtaLyss()); 
     bildYta.addKeyListener(new EscLyss()); 
     bildYta.requestFocusInWindow(); 
     enableOperations(false); 
    } 
} 

private class EscLyss extends KeyAdapter{ 
    public void keyPressed(KeyEvent e){ 
     if(e.getKeyCode()==KeyEvent.VK_ESCAPE){ 
      bildYta.setCursor(Cursor.getDefaultCursor()); 
      bildYta.removeMouseListener(bildYta.getMouseListeners()[0]); 
      bildYta.removeKeyListener(this); 
      enableOperations(true); 
     } 
    } 
} 

나는 bildYta에 청취자 모두를 추가하는 버튼을 누르면 내가 .ArrayIndexOutOfBoundsException 얻을 이유를 내가 이해하지 못하는 것은 :. 내가 방금 추가 한 마우스 수신기를 제거 할 때 0 때때로 나는 예외를 얻지도 않는다. 이온, 때로는 그렇습니다. 나머지 코드에서는 아무런 문제가 발생하지 않습니다. 그 리스너를 추가 한 후에는 내 프로그램에서 다른 일이 발생하지 않기 때문입니다. ESC 키 또는 마우스 클릭을 기다립니다.

+1

에서 제거하는 코드입니다됩니다 서라운드 s). 그러나 마우스 이벤트가 발생했을 때 – mKorbel

답변

2

이것은 매우 약한 코드입니다. EscLyss이 (가) 처리하는 이벤트는 여러 번 시작될 수 있으며 처음으로 작동 할 수 있습니다. 코드에 몇 가지 검사를 추가하십시오. 더 나아가 필드에 EscLyss 인스턴스를 저장 한 다음 해당 인스턴스를 직접 제거하십시오. 더 좋은 방법은 인스턴스를 최종적으로 만들고 재사용 할 수 있으므로 필요에 따라 반복해서 추가 및 제거 할 수 있습니다. 그것은 사실, 우리가 일반적으로하는 방식입니다.

private final MouseListener bildYtaLyss = new BildYtaLyss(); 

private class NyPlatsLyss implements ActionListener{ 
    public void actionPerformed(ActionEvent e) { 
    bildYta.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); 
    bildYta.addMouseListener(bildYtaLyss); 
    EscLyss escLyss = new EscLyss(); 
    bildYta.addKeyListener(escLyss); 
    bildYta.requestFocusInWindow(); 
    enableOperations(false); 
    } 
} 

private class EscLyss extends KeyAdapter{ 
    public void keyPressed(KeyEvent e){ 
    if(e.getKeyCode()==KeyEvent.VK_ESCAPE){ 
     bildYta.setCursor(Cursor.getDefaultCursor()); 
     bildYta.removeMouseListener(bildYtaLyss); 
     bildYta.removeKeyListener(this); 
     enableOperations(true); 
    } 
    } 
} 
+0

Im 매우 프로그래밍에 익숙하지 않으므로 나는 당신이 말한 모든 것을 이해합니다. 하지만 아프게 한번 더 화재에서 그것을 방지하는 검사의 일종을 시도하십시오 – Topsic

+0

좋아, 내가 사실을 설정 한 부울을 추가하려고, 그것은 정말로 도움이되지 못했습니다. 그러나 제거하기 전에'System.out.println (bildYta.getMouseListeners() [0]);'을 추가하면 마우스 리스너가 출력되고 덜 자주 실패합니다. – Topsic

+0

업데이트 된 답변보기. 그것이 물건을 분명히하기를 바란다. –

1

는/(또 다른 문제 /이있을 수있는 [SSCCE] (http://sscce.org/), 확인하여 질문을 수정 빨리 더 나은 도움을 SwingUtilities.invokeLater()