2010-02-18 164 views
1

GWT这里是新手...使用UIBinder布局GWT面板之间的谈话

我正在使用UIBinder的方式来布局一个应用程序,有点在GWT邮件示例的样式。该应用程序开始在OnModuleLoad()方法内添加到RootLayoutPanel的DockLayoutPanel。该DockLayoutPanel有一个静态的北方和南方静,使用自定义窗口小部件中心等被定义:

public class BigLayoutWidget extends ResizeComposite { 
... 
} 

此自定义窗口小部件布局使用BigLayoutWidget.ui.xml,这又由TabLayoutPanel的(3个标签页) ,其中第一个包含一个SplitLayoutPanel,分为WEST(Shortcuts.ui.xml)和CENTER(Workpanel.ui.xml)。快捷方式又由一个StackLayoutPanel和3个堆栈组成,每个堆栈都在自己的ui.xml文件中定义。

我想单击某个快捷方式的单个堆栈中的事件以更改Workpanel的内容,但到目前为止,我只能够在同一个类中操作小部件。使用最简单的情况下,我无法在快捷方式中单击按钮来清除Workpanel的内容或使WorkPanel不可见。

的几个问题...

  1. 是阶级的ResizeComposite正确的类型来扩展这个?我遵循从TopPanel,MailList等的Mail例子的方法,所以也许不是?
  2. 我该如何使这些点击操纵他们不居住的面板的内容?
  3. 听众不再推荐处理事件吗?我认为我在编译过程中看到过一些地方使用了ClickHandlers,并且点击监听器“订阅”方法已被弃用(我大多使用@UiHandler注释)
  4. 是否有一种简单的方法来获取特定元素的句柄在我的应用/页面? (应用UI.XML文件中的“ID”字段会生成弃用警告)。我正在寻找像document.getElementById()这样的东西,它让我能够处理特定的元素。如果存在,我如何设置元素上的句柄/ ID,然后如何通过名称/ ID调用该元素?

请注意,我有布局本身很好钉;这是从一个ui.xml模块化面板到下一个我无法完全获得的交互。

在此先感谢。

回答

4
  1. 如果你没有为调整事件的使用不是仅仅使用Composite
  2. 你想要的是什么,GWT开发者称为消息总线(如HandlerManager实现)。您可以在Google I/O 2009的Ray Ryan广泛讨论的内容(例如GWT Google Group,仅搜索'mvp')中得到一个很好的解释,其中可以找到here。基本上,您在该消息总线上“广播”一个事件,然后一个Widget监听该事件,获取该消息并执行其操作。
  3. 是的,*处理程序是当前处理事件的方式 - 使用基本相同,因此迁移不应该是一个问题(docs)。他们改变了它,以便将来可以引入自定义字段,而不会破坏现有代码。
  4. 如果您已经为任何DOM元素设置了id(对于小工具我使用someWidget.getElement().setId(id),通常与DOM.createUniqueId()结合使用),您可以通过GWT.get(String id)得到它。你会得到一个RootPanel,你必须把它投到正确的Widget类 - 正如你可以看到它可以得到一个'hackish'(如果你通过该ID改变Widget的类型?例外,或更糟糕),所以我建议坚持使用MVP(见第一点)并通过消息总线进行通信。但是请记住,有时它也是很好的聚集 - 并非一切都通过消息总线:)

底线是,我建议你拥抱MVP(和History)尽快处理 - 这让GWT开发更容易,更不麻烦:)(我从经验中知道,随着时间的推移,代码开始看起来像一场噩梦,如果你不把它分成演示文稿,视图等)