单击Handler在widget上工作但不在Element上

时间:2013-05-12 04:40:18

标签: gwt

我正在创建一个Anchor,如下所示:

Anchor a = new Anchor( "Click Me" );

然后我添加一个点击处理程序:

a.addClickHandler( new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
        GWT.log("Anchor Clicked");
    }
} );

我想将Anchor添加到LI元素中。由于我没有UL和LI的任何小部件,我使用以下结构:

public class ElementPanel extends ComplexPanel {

    public ElementPanel(String tagName) {
        setElement(DOM.createElement(tagName));
    }

    @Override
    public void add(Widget w) {
        add(w, getElement());
    }
}

我创建了我的UL元素:

ElementPanel ul = new ElementPanel(UListElement.TAG);

我创建了一个LI元素:

ElementPanel li = new ElementPanel(LIElement.TAG);

我将我的Anchor添加到LI,然后我将LI添加到UL(之后我添加到文档中):

li.add(a);
ul.add(li);

这很好用。如果我改变了前面的行,如下所示,我没有看到日志消息:

li.getElement().appendChild(a.getElement());
ul.add(li);

同样,如果我试试这个,我也看不到消息:

li.add(a);
ul.getElement().appendChild(li.getElement());

以前,我在UIBinder中有UL元素。但由于我没有成功向Element添加点击处理程序,我不得不求助于上述方法。

1 个答案:

答案 0 :(得分:1)

这是在GWT中处理事件的方式:小部件需要附加,这通常意味着将其添加到容器链中,直到RootPanel。有关详细信息,请参阅https://code.google.com/p/google-web-toolkit/wiki/DomEventsAndMemoryLeaks#GWT's_Solution

如果你的结构没有动态变化,拥有<ul><li>的最简单方法就是使用HTMLPanel(使用UiBinder会更容易)。

如果结构是动态的,那么可能会生成一个ComplexPanel,其根元素为UListElement,并将所有子窗口小部件包装成LIElement。看看ComplexPanel的内部,当面板本身是添加/删除子窗口小部件时,您会看到附加分离子窗口小部件附加,或者附加 / 分离时。