2012-04-18 28 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

相關問題