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

2022-09-04 01:12:42

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

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

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

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


答案 1

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

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模型中,它应该可以正常工作)


答案 2

通常,我使用指示 API 更改或用户更改的标志。对于每个侦听器,我会检查标志,如果它是API更改,只需返回。