1

我得到“线程中的异常“AWT-EventQueue-0”java.lang.ArrayIndexOutOfBoundsException:0,我真的不明白为什么。

我有这两个内部类,用作 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 回答