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

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

我有一个指示加载过程的标志,在通过模型设置UI字段时,我想使用它来临时禁止侦听器通知。所以我的问题是:

是否可以在不删除并重新附加它们的情况下全局临时禁用Swing中某些组件的侦听器?

最佳答案

您可以为侦听器使用一个通用的基类,并且在其中有一个静态方法来打开或关闭侦听器:

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/4722835/

10-16 14:59