Java 观察员不';t调用更新方法
嘿,我有一个MVC Java应用程序,它使用observer模式在每次更改时通知我的视图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模式设置所有内容
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();
}