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

Mic*_*Sim 14 java events swing event-dispatching

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

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

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

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

Sea*_*oyd 8

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你的听众必须实现doPerformAction()而不是actionPerformed().

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