Observer不会调用update方法

时间:2015-11-30 11:52:32

标签: java model-view-controller observer-pattern

嘿,我有一个MVC Java Applcation,它使用观察者模式通知我对每个变化的看法。
我有一个初学者类来初始化所有类并为我的MVC模式设置所有内容。

public static void main(String[] args) {
        FXView view = new FXView();
        JSONModel model = new JSONModel();
        model.addObserver(view);
        Controller controller = new Controller(view, model);
        view.registerController(controller);
        FXView.launch(FXView.class);
}

我有一个从Observable扩展的Model,它有一个写文件的方法。在那里,我想致电setChanged()notifyObserver()

public void writeFile() {
        try {
            FileWriter file = new FileWriter("C://path/to/file.json");
            file.write(obj.toJSONString());
            file.flush();
            file.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        setChanged();
        notifyObservers(obj);
}

每次写入文件时,我都希望我的视图能够了解它。我的观点确实实现了Observer,因此具有update()方法。

@Override
public void update(Observable o, Object arg) {
    JSONModel model = (JSONModel)o;
    this.obj = model.getObj();
}

使用调试器我无法检测到我的更新方法的调用。 当我启动程序 -->当我转到Starter类并调用“Run as Java Application”时,我的模型会加载一个默认值,然后调用writeFile()。文件已创建,setChanged()以及notifyObserver()被调用,但不会调用update()。有什么我错过的吗?

1 个答案:

答案 0 :(得分:2)

看起来,在启动阶段对notifyOberservers的调用是在添加Oberserver之前完成的。

这可以通过在调用update之前创建一个首先接受并添加Oberserver的Contructor来解决。

另一种方法是空构造函数并将init代码移动到另一个方法。因此,您可以在创建实例后调用addObserver,然后调用初始化方法。

就个人而言,我会选择第一个,因为我们不希望能够创建未初始化的实例(=未定义状态)。