如何在JTextField上移除MouseListener/ActionListener

12

我有以下代码向JTextField添加ActionListener:

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

现在我该如何使用chatInput.removeMouseListener()移除这个MouseListener,因为这个函数需要一个参数呢?

1个回答

24

您可以考虑以下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方法的Java文档。 如果您能够在所有监听器中识别出您想要删除的监听器,或者如果您想要删除所有监听器,则此方法可能有所帮助。
Great! I'm happy to help. What text do you need translated?
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;
}

我更喜欢第三个,因为它提供了一些灵活性,如果我想再次打开鼠标监听器,我不需要创建新对象。


1
通常我使用第一种选项永久性地从一个比注册该监听器的组件寿命更长的组件中删除监听器(例如在 dispose() 方法中)。为了暂时禁用监听器,我使用了第三种选项。这在大多数情况下是为了防止递归。例如,当在文本更改时触发监听器导致同一文本的更改(无论什么原因),我会在其监听方法的开头禁用监听器,在结尾处启用它。 - Christian Semrau
我猜在使用MouseListener之前必须先创建它。我无法删除匿名的MouseListeners。 - mithun1538

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接