当Widget插入GWT DIV元素时,GWT Widget事件处理程序不起作用

时间:2015-05-26 01:36:53

标签: java javascript gwt widget

我有一个自定义小部件,可以接受其中的小部件。这是代码:

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);
}

当我运行它时,它会正确显示我想要的小部件: Custom Widget Element

但问题是,当我尝试单击按钮时,单击处理程序无法正常工作。问题是:

  1. 为什么不工作?
  2. 我该怎么做才能让它发挥作用?
  3. 任何意见或建议将不胜感激。谢谢和问候。

1 个答案:

答案 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;
            }
        }
    });