假设我有一个自定义小部件,它有一个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,之后我附加了子事件,如果建议那样。谢谢你提前寻求帮助。
裤裤
答案 0 :(得分: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);
但是,我没有对此进行测试,我不建议您在实际应用程序中使用它。使用add()
绝对是首选,以这种方式使用appendChild()
没有任何优势,可能会导致意外行为。