使用UIBinder布局在GWT面板中交谈

时间:2010-02-18 22:39:17

标签: events gwt uibinder

GWT的新手......

我正在使用UIBinder方法来布局应用程序,有点像GWT Mail样本的风格。该应用程序以onModuleLoad()方法中添加到RootLayoutPanel的DockLayoutPanel开始。 DockLayoutPanel具有静态North和静态South,使用定义为:

的自定义中心窗口小部件
public class BigLayoutWidget extends ResizeComposite {
...
}

此自定义窗口小部件使用BigLayoutWidget.ui.xml进行布局,BigLayoutWidget.ui.xml又包含一个TabLayoutPanel(3个选项卡),其中第一个包含分为WEST(Shortcuts.ui.xml)和CENTER(Workpanel)的SplitLayoutPanel。 ui.xml)。反过来,快捷方式包含一个包含3个堆栈的StackLayoutPanel,每个堆栈都在自己的ui.xml文件中定义。

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

一些问题......

  1. ResizeComposite是否适合扩展此类?我正在关注TopPanel,MailList等的Mail示例中的方法,所以可能不是吗?
  2. 如何让这些点击操作它们不存在的面板内容?
  3. 是否不再建议听众处理活动?我以为我在编译期间看到了某些地方,现在使用了ClickHandlers,并且不推荐使用点击监听器“订阅”方法(我主要使用@UiHandler注释)
  4. 是否有一种简单的方法来处理我的应用/页面中的特定元素? (在UI.XML文件中应用“ID”字段会生成弃用警告)。我正在寻找像document.getElementById()这样的东西来获取特定元素的句柄。如果存在,如何在元素上设置句柄/ ID,然后如何通过名称/ ID调用该元素?
  5. 请注意,我的布局本身很好;这是从一个ui.xml模块化面板到下一个我无法完成的面板的交互。

    提前致谢。

1 个答案:

答案 0 :(得分:4)

  1. 如果您没有使用调整事件大小而不仅仅使用Composite
  2. 你想要的是GWT开发人员所谓的消息总线(实现为HandlerManager)。你可以在广泛讨论的(例如,GWT Google Group,只搜索'mvp')中得到一个很好的解释,Ray Ryan可以从Google I / O 2009中找到here。基本上,你在该消息总线上“广播”一个事件,然后一个Widget监听该事件获取消息并完成它的工作。
  3. 是的,*处理程序是当前处理事件的方式 - 用法基本相同,因此迁移不应成为问题(docs)。他们对其进行了更改,以便将来可以引入自定义字段,而不会破坏现有代码。
  4. 如果您为任何DOM元素设置id(对于我使用someWidget.getElement().setId(id)的小部件,通常与DOM.createUniqueId()一起使用),您可以通过GWT.get(String id)获取。然后你会得到一个RootPanel,你必须把它投射到正确的Widget类 - 你可以看到它可以得到一些'hackish'(如果你用那个id改变Widget的类型怎么办?例外或更糟糕的是,所以我建议坚持使用MVP(参见第一点)并通过消息总线进行通信。但请记住,有时聚合也很好 - 不是所有东西都必须通过消息总线处理:)
  5. 底线是我建议尽快拥抱MVP(和History) - 它使GWT开发更容易,更简洁:)(我从经验中知道,随着时间的推移代码开始看起来就像一场噩梦,如果你不把它分成演示,观点等等。)