2010-08-04 69 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的引用。