【问题标题】:how to remove MouseListener / ActionListener on a JTextField如何删除 JTextField 上的 MouseListener / ActionListener
【发布时间】:2010-04-13 08:14:04
【问题描述】:

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

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

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

【问题讨论】:

    标签: java swing actionlistener


    【解决方案1】:

    您可以考虑 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 方法的 javadocs。 如果您可以在所有侦听器中确定要删除的侦听器,或者如果您想删除所有侦听器,则此方法可能会有所帮助。


    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;
    }
    

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

    【讨论】:

    • 我通常使用第一个选项从一个组件中永久删除一个侦听器,该组件的寿命比注册侦听器的组件的寿命长(例如,在dispose() 方法中)。为了暂时禁用监听器,我使用了第三个选项。这主要是为了防止递归。例如。当触发文本更改的侦听器导致同一文本发生更改(无论出于何种原因)时,我会在其侦听方法的开头禁用侦听器并在结束时启用它。
    • 我想我必须在使用它之前创建一个 MouseListener。我无法删除匿名 MouseListeners。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2016-10-29
    • 2013-02-16
    • 2016-08-23
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多