@UiHandler的文档

时间:2010-08-09 14:03:37

标签: java gwt uibinder

我开始研究将GWT与UiBuilder结合使用。我有点疑惑你如何使用@UiHandler(..)指令来制作简单的事件处理代码,如GWT documentation所述:

@UiHandler("button")
void handleClick(ClickEvent e) {
  Window.alert("Hello, AJAX");
}

在这种情况下,使用方法handleClick。 您如何知道每个GWT小部件可以使用@UiHandler创建哪些方法?对于某些人,您还可以创建doClose()方法。

但是,你可以使用什么来ListBox来获取一个项目被选中的事件?我可以在文档中看到这个吗?

2 个答案:

答案 0 :(得分:33)

您传递给@UiHandler注释的参数是您要分配*Handler的相应字段的名称。因此,在这种情况下,您要为ClickHandler分配Button button(实际上,我们只知道字段的名称)。

至于它是如何工作的 - 它是GWT魔术的一部分:)我的猜测是,就像任何其他与UiBinder相关的代码(我认为在Google IO上有一个演示文稿,显示了UiBinder生成的代码),编译时间编译器计算出去哪里。在此示例中:我们有一个Button button,我们有一个带有@UiHandler参数的ClickEvent带注释的方法 - > 必须表示它是ClickHandler(注意方法的名称​​不重要)。所以让我们在编译时添加一些代码(可能在构造函数中),将该处理程序添加到按钮中。如果您对更全面的答案感兴趣 - 请查看来源:D

  

但你能用什么,为...   例如,ListBox来获取一个事件   选择了一个项目?在哪里   文档可以看到吗?

GWT API reference中。在这种情况下,您可能正在寻找ListBox.addChangeHandler。但是你通常不会在那里找到@UiHandler相关的代码 - 那是因为它是多余的 - 你总是以同样的方式构建@UiHandler方法:

  1. 您检查了要添加的*Handler,说ChangeHandler
  2. 它有void onChange(ChangeEvent event) - 因此,您的方法需要ChangeEvent参数,并且应该如下所示:

    @UiHandler("listBox")
    void whateverName(ChangeEvent event) {
        // ...
    }
    

答案 1 :(得分:1)

您的onModuleLoad方法可能存在问题:

public void onModuleLoad() 
{       
    HelloWorld helloWorld = new HelloWorld("BOTAO"); 

    // Using this way @UiHandler will not work
    //Document.get().getBody().appendChild(helloWorld.getElement()); 

    // correct way
    RootPanel.get().add(helloWorld);  
}