Java 观察员不';t调用更新方法

Java 观察员不';t调用更新方法,java,model-view-controller,observer-pattern,Java,Model View Controller,Observer Pattern,嘿,我有一个MVC Java应用程序,它使用observer模式在每次更改时通知我的视图 我有一个初学者类来初始化所有类,并为我的MVC模式设置所有内容 public static void main(String[] args) { FXView view = new FXView(); JSONModel model = new JSONModel(); model.addObserver(view); Controller c

嘿,我有一个MVC Java应用程序,它使用observer模式在每次更改时通知我的视图
我有一个初学者类来初始化所有类,并为我的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扩展而来的模型,并且有一个写文件的方法。我想在那里调用
setChanged()
notifyObserver()

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

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

使用调试器,我无法检测到对更新方法的调用。当我启动程序时,
-->
当我转到我的初学者类并调用“作为Java应用程序运行”时,我的模型加载一个默认值,然后调用
writeFile()
。将创建文件,并调用
setChanged()
以及
notifyObserver()
,但不会调用
update()
。有什么遗漏吗?

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

这可以通过创建一个构造函数来解决,该构造函数在调用update之前首先获取并添加一个Oberserver

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


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

NotifyObservators方法是什么样子的?只是来自
java.util.Observable
的standart方法调用,我自己没有写任何东西。“当我启动程序时”。。。这意味着在模型的构造函数中。。。在添加观察者之前执行哪个操作?您可以尝试给JSONModel一个构造函数,在这里您可以给它一个观察者。然后在ctor内部,首先添加观察者,然后执行其余的初始化。抱歉,写得不清楚。但我认为你说得有道理。“我来看看。”费尔多解决了我的问题。
@Override
public void update(Observable o, Object arg) {
    JSONModel model = (JSONModel)o;
    this.obj = model.getObj();
}