2010-04-13 82 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