假设我有一个具有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!"); }
}
当我尝试添加这个Widget时:
TestWidget testWidget = new TestWidget("myTestWidget"); RootPanel.get().add(testWidget);
一切都好.如果我点击我的按钮,我会得到我期望的消息.
但是,如果我这样添加:
TestWidget testWidget = new TestWidget("myTestWidget"); RootPanel.getBodyElement().appendChild(testWidget.getElement());
我的点击事件没有被解雇.我很难理解为什么.
如果有人可以向我解释这个或将我链接到我可以阅读的资源,那将是很好的.最后我想知道是否有可能添加clickhandler后我添加了子事件,如果建议这样.谢谢你提前寻求帮助.
裤裤
解决方法
当您调用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);
但是,我没有对此进行测试,我不建议您在实际应用程序中使用它.使用add()绝对是首选,使用appendChild()以这种方式没有任何优势,可能会导致意外行为.