2012-04-18 77 views
1

即时得到“异常线程‘AWT-EventQueue的 - 0’java.lang.ArrayIndexOutOfBoundsException:0 ,我真的不明白为什么删除的MouseListener产生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

为更好地帮助越早用[SSCCE(http://sscce.org/),相信有可能是编辑您的问题移除代码/是/是另一个问题( s),但成为鼠标事件后触发 – mKorbel 2012-04-18 09:20:19

回答

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 2012-04-18 10:42:18

+0

好吧我尝试添加一个布尔值,它被解雇后设置为true,它并没有真正的帮助。但是当我添加'System.out.println(bildYta.getMouseListeners()[0]);''在我删除它之前,它会打印一个鼠标监听器,并且它似乎不太经常失败 – Topsic 2012-04-18 10:50:04

+0

查看更新的答案。希望它澄清事情。 – 2012-04-18 11:05:35

相关问题