如何在JTextField上删除MouseListener/ActionListener

mit*_*538 10 java swing actionlistener

我有以下代码将ActionListener添加到JTextField:

chatInput.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseClicked(java.awt.event.MouseEvent evt) {
       chatInputMouseClicked(evt);
    }
});
Run Code Online (Sandbox Code Playgroud)

现在如何使用chatInput.removeMouseListener()此函数删除此MouseListener ,因为此函数需要参数?

Rom*_*man 19

您可以考虑3种方法:

1)在添加之前保存对您的侦听器的引用,以便稍后将其删除:

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

2)你可以使用相应的方法获得所有特定的事件监听器,例如:

public MouseListener[] getMouseListeners()  
Run Code Online (Sandbox Code Playgroud)

要么

public EventListener[] getListeners(Class listenerType)
Run Code Online (Sandbox Code Playgroud)

以下是第一种第二种方法的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;
}
Run Code Online (Sandbox Code Playgroud)

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