2012-04-18 7 views
1

イムなって「例外スレッドで 『AWT-EventQueueの-0』 java.lang.ArrayIndexOutOfBoundsException:0 と私は本当に理由を理解しないは、ArrayIndexOutOfBoundsExceptionがを生成

私がリスナーとして使用し、これらの2つの内部クラスを持っています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

で削除コードしているされてサラウンドマウスイベントが発生した後になる – 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

私は非常にプログラミングに新しいので、私はあなたが言ったすべてを理解していないかわからない。しかし、病気を試してみると、何度も火を止めることができます。 – Topsic

+0

私は、それが発砲した後に真に設定されたブール値を追加しようとしました。しかし、削除する前に 'System.out.println(bildYta.getMouseListeners()[0]);'を追加すると、マウスリスナーが表示され、それほど頻繁に失敗しないようです。 – Topsic

+0

更新された回答を参照してください。それが事を明確にすることを願っています。 –

1

は/(別の問題/があるかもしれません[SSCCE](http://sscce.org/)、確かにあなたの質問を編集早いほど良いの助けをSwingUtilities.invokeLater()

関連する問題