java - 如何在 Swing 中暂时禁用事件监听器?

标签 java events swing event-dispatching

我有一个带有模型和 View 的 Swing 应用程序。在 View (GUI)中有很多组件,每个组件都映射到模型对象的某些属性并显示它的值。

现在有一些 UI 组件,当 UI 中的某些模型属性值发生变化时,会自动触发某些模型属性的更新。这需要我在 UI 中重新加载完整的模型。这样我就进入了无限更新循环,因为 UI 中的每个模型重新加载都会触发另一个模型重新加载。

我有一个指示加载过程的标志,我想用它来暂时抑制监听器通知,同时从模型设置 UI 字段。所以我的问题是:

有没有办法在 Swing 中全局暂时禁用某些组件的监听器,而无需删除并重新附加它们?

最佳答案

您可以为监听器使用公共(public)基类,并在其中使用静态方法来打开或关闭监听器:

public abstract class BaseMouseListener implements ActionListener{

    private static boolean active = true;
    public static void setActive(boolean active){
        BaseMouseListener.active = active;
    }

    protected abstract void doPerformAction(ActionEvent e);

    @Override
    public final void actionPerformed(ActionEvent e){
        if(active){
            doPerformAction(e);
        }
    }
}

您的监听器必须实现 doPerformAction() 而不是 actionPerformed()

(这在企业场景中会很糟糕,但在像 Swing 这样的单 VM 模型中,它应该可以正常工作)

关于java - 如何在 Swing 中暂时禁用事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35815278/

相关文章:

java - Knopflerfish,在 bundle 中使用外部库

java - 从 Java 中过滤 Scala 集

html - 使用 ng-show AngularJS 传递元素

java - 如何为 Action 监听器编写 JUnit?

javascript - jquery 两个具有相同类的不同触发器

java - 如何管理 native 堆?

java - 将所有组件设置为 JFrame 的中心

java - JTextField 中的占位符 - Java Swing

java - 如何在 JPanel 中绘制标尺?

java - 递归中的无限循环