Gwt 单击处理程序处理小部件,但不处理元素

Gwt 单击处理程序处理小部件,但不处理元素,gwt,Gwt,我正在创建一个锚,如下所示: 锚定a=新锚定(“单击我”); 然后我添加了一个单击处理程序: a.addClickHandler(新的ClickHandler(){ @凌驾 公共作废一次点击(点击事件){ GWT.log(“锚点击”); } } ); 我想将锚点添加到LI元素。由于我没有UL和LI的任何小部件,因此我使用以下构造: public类元素面板扩展了ComplexPanel{ 公共元素面板(字符串标记名){ setElement(DOM.createElement(标记名)); }

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

锚定a=新锚定(“单击我”);
然后我添加了一个单击处理程序:

a.addClickHandler(新的ClickHandler(){
@凌驾
公共作废一次点击(点击事件){
GWT.log(“锚点击”);
}
} );
我想将锚点添加到LI元素。由于我没有UL和LI的任何小部件,因此我使用以下构造:

public类元素面板扩展了ComplexPanel{
公共元素面板(字符串标记名){
setElement(DOM.createElement(标记名));
}
@凌驾
公共无效添加(小部件w){
添加(w,getElement());
}
}
我创建我的UL元素:

ElementPanel ul=新的ElementPanel(UListElement.TAG);
我创建了一个LI元素:

ElementPanel li=新的ElementPanel(LIElement.TAG);
我将我的锚添加到LI,然后将LI添加到UL(之后我添加到文档):

li.添加(a);
ul.添加(li);
这个很好用。如果改为按以下方式更改前几行,则不会看到日志消息:

li.getElement().appendChild(a.getElement());
ul.添加(li);
类似地,如果我尝试这样做,我也不会看到消息:

li.添加(a);
ul.getElement().appendChild(li.getElement());

以前,我在UIBinder中有UL元素。但是,由于我没有成功地将单击处理程序添加到元素中,因此我不得不采用上述方法

这是GWT中处理事件的方式:需要附加小部件,这通常意味着将其添加到容器链中,直至
根面板。有关详细信息,请参阅

如果您的结构没有动态更改,那么使用
  • 最简单的方法就是使用
    HTMLPanel
    (使用UiBinder更容易)


    如果结构是动态的,那么可能创建一个
    ComplexPanel
    ,其根元素是
    UListElement
    ,并将所有子窗口小部件包装到一个
    lieelement
    。查看一下
    ComplexPanel
    的内部结构,您将看到它在连接面板时添加/删除子窗口小部件时,或者在连接/分离面板时,都会附加和分离子窗口小部件。

    这就是我对扩展ComplexPanel的ElementPanel类所做的。上面的所有代码都在一个复合类型类中,该类使用的UI绑定器的根元素是HTMLPanel。整个过程从onModuleLoad方法(通过RootPanel)添加到DIV元素中。我试图理解为什么我在文章末尾提到的更改破坏了点击处理程序。为什么在添加一个小部件和一个元素时,is似乎会产生不同。当您添加小部件的元素时,小部件没有连接,因此它不会侦听事件。顺便说一句,我建议制作一个同时使用
  • 的面板,而不是一个一个(就像
    水平面板
    使用
    等),我会试试你的建议。我确实找到了下面的帖子,它进一步解释了GWT中的元素附加和事件: