嘿!我對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