观察者不调用更新方法
Observer doesn't call update method
嘿,我有一个 MVC Java 应用程序,它使用观察者模式在每次更改时通知我的视图。
我有一个启动器 class 来初始化所有 classes 并为我的 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()
.
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 class 并调用 "Run as Java Application" 时,我的模型加载默认值然后调用 writeFile()
。文件被创建, setChanged()
和 notifyObserver()
被调用,但 update()
不会被调用。有什么我错过的吗?
看起来,在启动阶段调用 notifyOberservers 是在添加 Oberserver 之前完成的。
这可以通过创建一个构造函数来解决,该构造函数在调用更新之前先接受并添加一个观察者服务器。
另一种方法是使用空构造函数并将初始化代码移至其他方法。所以可以在创建实例后调用addObserver,然后调用初始化方法。
就我个人而言,我会选择第一个,因为我们不希望能够创建未初始化(= 未定义状态)的实例。
嘿,我有一个 MVC Java 应用程序,它使用观察者模式在每次更改时通知我的视图。
我有一个启动器 class 来初始化所有 classes 并为我的 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()
.
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 class 并调用 "Run as Java Application" 时,我的模型加载默认值然后调用 writeFile()
。文件被创建, setChanged()
和 notifyObserver()
被调用,但 update()
不会被调用。有什么我错过的吗?
看起来,在启动阶段调用 notifyOberservers 是在添加 Oberserver 之前完成的。
这可以通过创建一个构造函数来解决,该构造函数在调用更新之前先接受并添加一个观察者服务器。
另一种方法是使用空构造函数并将初始化代码移至其他方法。所以可以在创建实例后调用addObserver,然后调用初始化方法。
就我个人而言,我会选择第一个,因为我们不希望能够创建未初始化(= 未定义状态)的实例。