GWT将ClickHandler添加到DOM元素

kuk*_*das 8 gwt

假设我有一个具有ClickHandler的自定义小部件.这是一个例子:

public class TestWidget extends Composite {

private static TestWidgetUiBinder uiBinder = GWT
        .create(TestWidgetUiBinder.class);

interface TestWidgetUiBinder extends UiBinder<Widget, TestWidget> {
}

@UiField
Button button;

public TestWidget(String firstName) {
    initWidget(uiBinder.createAndBindUi(this));
    button.setText(firstName);
}

@UiHandler("button")
void onClick(ClickEvent e) {
    Window.alert("Hello!");
}
Run Code Online (Sandbox Code Playgroud)

}

当我尝试添加这个Widget时:

    TestWidget testWidget = new TestWidget("myTestWidget");
    RootPanel.get().add(testWidget);
Run Code Online (Sandbox Code Playgroud)

一切都好.如果我点击我的按钮,我会得到我期望的消息.但是如果我像这样添加它:

TestWidget testWidget = new TestWidget("myTestWidget");
    RootPanel.getBodyElement().appendChild(testWidget.getElement());
Run Code Online (Sandbox Code Playgroud)

我的点击事件没有被解雇.我很难理解为什么.如果有人可以向我解释这个或将我链接到我可以阅读它的资源,那将是很好的.最后我想知道是否可以添加clickhandler,之后我附加了子事件,如果建议那样.谢谢它提前寻求帮助.

裤裤

dsl*_*slh 7

当您调用时add(),Widget.onAttach()将在正添加到面板的窗口小部件上调用.onAttach做了一些工作来注册小部件来接收事件.appendChild()简单地将一个DOM元素附加到另一个DOM元素并且不执行任 通过这样做,您应该能够在第二种情况下获取事件:

Element element = testWidget.getElement();
RootPanel.getBodyElement().appendChild(element);
DOM.sinkEvents(element,
    Event.getTypeInt(ClickEvent.getType().getName())
    | DOM.getEventsSunk(element);
Run Code Online (Sandbox Code Playgroud)

但是,我没有对此进行测试,我不建议您在实际应用程序中使用它.使用add()绝对是优选的,appendChild()以这种方式使用没有任何优点并且可能导致意外行为.