2010-04-13 75 views
9

刪除的MouseListener/ActionListener的我有下面的代碼添加一個ActionListener一個JTextField:如何在一個JTextField

chatInput.addMouseListener(new java.awt.event.MouseAdapter() { 
    public void mouseClicked(java.awt.event.MouseEvent evt) { 
     chatInputMouseClicked(evt); 
    } 
}); 

現在我該怎樣刪除使用chatInput.removeMouseListener()此MouseListener的,因爲該功能需要一個自變量?

回答

18

你可以考慮3種方法:

1)保存參考監聽器添加它之前,所以你可以稍後將其刪除:

MouseListener ml = new MouseAdapter() { 
    public void mouseClicked(java.awt.event.MouseEvent evt) { 
     chatInputMouseClicked(evt); 
    } 
}; 
chatInput.addMouseListener (ml); 
... 
chatInput.removeMouseListener (ml); 

2)你可以得到所有某些事件監聽器採用相應的方法如:

public MouseListener[] getMouseListeners() 

public EventListener[] getListeners(Class listenerType) 

下面是firstsecond方法的javadoc。 如果您可以在所有聽衆中識別您想要移除的聽衆,或者您想移除所有聽衆,則此方法可能有所幫助。


3)你可以使用一些布爾變量來'關閉'你的監聽器。但是,你應該注意到變量應該是外部類的字段:

private boolean mouseListenerIsActive; 

public void doSmthWithMouseListeners() { 
    mouseListenerIsActive = true; 

    chatInput.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(MouseEvent evt) { 
      if (mouseListenerIsActive) { 
       chatInputMouseClicked(evt); 
      } 
     } 
    }); 
} 

public void stopMouseListner() { 
    mouseListenerIsActive = false; 
} 

我寧願第三個,因爲它提供了一些靈活性,如果我想打開鼠標監聽再次我不需要創造新的對象。

+0

我通常使用第一個選項從一個組件中永久刪除一個偵聽器,該組件的生命週期長於註冊偵聽器的組件(例如在'dispose()'方法中)。 要暫時禁用偵聽器,我已經使用了第三個選項。這主要是爲了防止遞歸。例如。當觸發文本更改的偵聽器導致同一文本發生更改(無論出於何種原因)時,我會在偵聽方法開始時禁用偵聽器,並在最後啓用它。 – 2010-04-13 09:13:09

+0

我想我必須在使用它之前創建一個MouseListener。我不能刪除匿名MouseListeners。 – mithun1538 2010-04-13 18:38:28