我有一个自定义小部件,可以接受其中的小部件。这是代码:
public class CustomDivWidget extends Widget {
protected Element divElement = DOM.createDiv();
public CustomDivWidget() {
divElement.getStyle().setWidth(100, Unit.PX);
divElement.getStyle().setHeight(100, Unit.PX);
divElement.getStyle().setBorderStyle(BorderStyle.SOLID);
divElement.getStyle().setBorderWidth(1, Unit.PX);
divElement.getStyle().setBorderColor("blue");
setElement(divElement);
}
public void add(Widget child) {
divElement.appendChild(child.getElement());
}
}
这就是我使用它的方式:
public void onModuleLoad() {
CustomDivWidget customDiv = new CustomDivWidget();
TextButton button = new TextButton("Button 1");
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert("Button 1 clicked!");
}
});
customDiv.add(button);
RootPanel.get().add(customDiv);
}
当我运行它时,它会正确显示我想要的小部件:
但问题是,当我尝试单击按钮时,单击处理程序无法正常工作。问题是:
任何意见或建议将不胜感激。谢谢和问候。
答案 0 :(得分:0)
我认为你以这种方式绕过GWT的事件系统(虽然我不确定)。但是,为什么不使用FlowPanel?
protected FlowPanel fp = new FlowPanel();
public CustomDivWidget() {
fp.getElement().getStyle().setWidth(100, Unit.PX);
fp.getElement().getStyle().setHeight(100, Unit.PX);
fp.getElement().getStyle().setBorderStyle(BorderStyle.SOLID);
fp.getElement().getStyle().setBorderWidth(1, Unit.PX);
fp.getElement().getStyle().setBorderColor("blue");
setElement(fp.getElement());
}
除此之外,为什么使用DOM元素而不是小部件?使用小部件而不必处理DOM是GWT等工具包的关键特性之一(我的观点仅限于此处)。
编辑:尝试将处理程序直接附加到DOM,以查看它是否有任何区别:
DOM.setEventListener(button.getElement(), new EventListener() {
@Override
public void onBrowserEvent(Event e) {
switch (DOM.eventGetType(e)) {
case Event.ONCLICK:
System.out.println("click");
break;
}
}
});