23

我开始考虑将 GWT 与 UiBuilder 结合使用。我对如何使用该@UiHandler(..)指令来制作GWT 文档中所写的简单事件句柄代码感到有些困惑:

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

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

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

4

2 回答 2

33

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

至于这到底是如何工作的——它是 GWT 魔法的一部分 :) 我的猜测是,就像任何其他 UiBinder 相关代码一样(我认为 Google IO 上有一个演示文稿,显示了 UiBinder 生成的代码),在编译时编译器弄清楚什么去哪里。在这个例子中:我们有一个Button button,并且我们有一个带参数的带@UiHandler注释的方法ClickEvent->必须意味着它是 a ClickHandler(注意方法的名称无关紧要)。因此,让我们在编译时(可能在构造函数中)添加一些代码,将处理程序添加到按钮。如果您对更全面的答案感兴趣 - 请查看来源:D

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

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

  1. 你检查*Handler你想添加的,说ChangeHandler
  2. 它有一个void onChange(ChangeEvent event)- 所以,你的方法需要一个ChangeEvent参数,应该是这样的:

    @UiHandler("listBox")
    void whateverName(ChangeEvent event) {
        // ...
    }
    
于 2010-08-09T14:36:25.153 回答
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);  
}
于 2012-12-21T13:51:26.257 回答