嘿!我对GWT和Java编程(或者OOP)都比较陌生,因此对于初学者的问题/错误提前表示歉意。我一直在尝试创建某种观察者模式,但开发模式控制台不断丢弃错误消息,可悲的是,它们远没有帮助。GWT上的观察者模式
所以这就是我想要实现的: - 我已经得到了包含类Country的模型,并存储了一个名为Influence的值。 - 视图是名为CountryDisplay的类。这是一个应该始终显示给定国家当前影响力的GWT小部件。
public class Country {
private int influece;
private CountryDisplay display;
public Country() {
influence = 0;
}
public void setDisplay(CountryDisplay display) //...
public int getInfluence() //...
public void setInfluence(int value) {
influence = value;
display.update();
}
}
public class CountryDisplay {
private Country country;
public CountryDisplay (Country country) {
//GWT widget creating stuff
this.country = country;
}
public void update() {
//InfluenceCounter is a simple Label
InfluenceCounter.setText(Integer.toString(country.getInfluence()));
}
}
然后在入口点类我做这样的事情:
Country italy = new Country();
CountryDisplay italyDisplay = new CountryDisplay(italy);
italy.setDisplay(italyDisplay);
RootPanel.get("nameFieldContainer").add(italyDisplay);
italy.setInfluence(3);
发展控制台表示,它与线有问题“display.update();”在课堂上的国家。我的第一个猜测是问题在于显示没有启动,所以我为它创建了一个接口,并在Country构造函数中创建了一个空的新的显示,稍后将被覆盖。
public Country() {
influence = 0;
display = new DisplayInterface() {
public void update() {}
}
}
但我没有这样的运气。我猜这种交叉引用是不允许的?我的意思是说,这个观点将模型作为一个变量,反之亦然。 当单独呼吁视图的方法(如:
italy.setInfluence(3);
italyDisplay.displayTheCurrentValue();
)它的工作原理,所以这个问题是绝对在观察者的逻辑。
你原来的代码对我来说似乎还行。当你调用'update'时,你确定'display'字段被正确初始化了吗?在调用'display.update()'之前,最好添加一个调试点(log /'Window.alert')以确保(也确保将其初始化为'null')。另一个可能的缺陷:'setDisplay'方法使用'display'作为参数 - 你确定它没有阻止显示字段? – adamk 2010-08-04 22:08:46
哇,很好的adamk。在原始代码中,我在Country构造函数中使用了setInfluence方法,而不是像在这里那样设置影响值,而是在初始化之前完成。现在我首先提出这个问题感到羞愧。谢谢,并发表一个答案,以便我可以接受它! – 2010-08-04 22:16:43
不是您的问题的答案,但您的代码看起来与GWT团队在下一个版本的GWT中引入的MVP模式非常相似。也许你想看看它:http://code.google.com/webtoolkit/articles/mvp-architecture.html。它确实简化了很多事情! – monzonj 2010-08-06 13:00:19