2010-08-04 100 views
1

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

)它的工作原理,所以這個問題是絕對在觀察者的邏輯。

+0

你原來的代碼對我來說似乎還行。當你調用'update'時,你確定'display'字段被正確初始化了嗎?在調用'display.update()'之前,最好添加一個調試點(log /'Window.alert')以確保(也確保將其初始化爲'null')。另一個可能的缺陷:'setDisplay'方法使用'display'作爲參數 - 你確定它沒有阻止顯示字段? – adamk 2010-08-04 22:08:46

+0

哇,很好的adamk。在原始代碼中,我在Country構造函數中使用了setInfluence方法,而不是像在這裏那樣設置影響值,而是在初始化之前完成。現在我首先提出這個問題感到羞愧。謝謝,並發表一個答案,以便我可以接受它! – 2010-08-04 22:16:43

+0

不是您的問題的答案,但您的代碼看起來與GWT團隊在下一個版本的GWT中引入的MVP模式非常相似。也許你想看看它:http://code.google.com/webtoolkit/articles/mvp-architecture.html。它確實簡化了很多事情! – monzonj 2010-08-06 13:00:19

回答

0

如果我理解正確,您正嘗試將用戶界面元素(您的視圖類CountryDisplay)「綁定」到數據(模型類Country)。 「綁定」的意思是,如果更改模型數據(例如,調用italy.setInfluence(10)),視圖會自動更新以反映更改。如果你的觀點提供了一個編輯器,你希望「綁定」也可以在另一個方向上工作。

有幾個框架實現了這一點,例如見文章Best data binding solution for GWT。我已經使用GWT Pectin,並有GWT Editors framework(我還沒有用過,因爲它相對較新)。看看你的代碼,我覺得你可能想更清楚地將模型從視圖中分離出來:你的模型類(Country)不應該瞭解視圖類,也就是說,它不應該存儲對CountryDisplay的引用。