【问题标题】:Why are observers not notified?为什么不通知观察员?
【发布时间】:2023-03-23 20:46:01
【问题描述】:

我正在尝试在作为学校项目的 Java Swing 应用程序中实现观察者模式。我有这两个非常简单的类,一个是单例可观察模型,第二个是观察者。

可观察模型:

public class Model extends Observable {

    private static Model instance = null;
    private File selectedImageFile;
    private int colorsCount;

    public static Logger LOG = Logger.getLogger(Model.class);

    private Model() {
        this.initialize();
    }

    private void initialize() {
        addObserver(new ModelObserver());
    }

    public static Model instance() {
        if (Model.instance == null) {
            Model.instance = new Model();
        }
        return Model.instance;
    }

    public void setColorsCount(int colorsCount) {
        this.colorsCount = colorsCount;
        notifyObservers(Actions.COLORS_COUNT);
    }

    public void selectedImage(File imageFile) {
        this.selectedImageFile = imageFile;
        notifyObservers(Actions.SELECTED_IMAGE);
    }

    public enum Actions {
        SELECTED_IMAGE, COLORS_COUNT
    }

}

观察者

public class ModelObserver implements Observer {

    public static Logger LOG = Logger.getLogger(ModelObserver.class);

    @Override
    public void update(Observable o, Object arg) {

        if (arg instanceof Model.Actions) {

            Model.Actions action = (Actions) arg;

            switch (action) {

            case SELECTED_IMAGE:
                selectedImage();
                break;

            case COLORS_COUNT:
                colorsCount();
                break;

            default:
                LOG.warn("Not supported action: " + action);
                break;
            }

        } else {
            LOG.warn("Not supported action: " + String.valueOf(arg));
        }

    }

    private void colorsCount() {
        LOG.info("Colors count has been changed....");
    }

    private void selectedImage() {
        LOG.info("Image has been changed....");
    }

}

一切正常 - 模型实例注册更改,但观察者(在我的例子中只有一个)没有收到通知。在ModeObserver.update(Observable o, Object arg) 方法中没有提到模型已更改。所以我的问题是没有通知观察者。

我做错了什么?谢谢。

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布 SSCCE。

标签: java swing design-patterns observer-pattern


【解决方案1】:

您忘记调用setChanged() 将可观察对象标记为已更改,这是notifyObservers 实际执行通知所必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多