1

「スレッド「AWT-EventQueue-0」の例外」java.lang.ArrayIndexOutOfBoundsException:0が発生しましたが、その理由がよくわかりません。

私はこれらの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が押されるかマウスがクリックされるのを待ちます

4

2 に答える 2

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);
    }
  }
}
于 2012-04-18T09:07:20.620 に答える
1

削除コードを囲みますSwingUtilities.invokeLater()

于 2012-04-18T09:08:56.547 に答える