如何将自定义窗口小部件添加到元素

时间:2011-05-31 05:02:03

标签: gwt

GWT RootPanel.get(“id”)不会返回嵌入HTML元素的div标记。

离。 &LT;身体GT;   &LT;表&gt; &LT; TR&GT; &LT; TD&GT; &lt; div id =“x”/><td>...</table> ...

如何访问此div标签和“添加小部件”。

我尝试过的一件事是从widget或widget.getElement()中获取元素,并将此元素添加到从DOM.getElementById()获取的元素中。

小部件确实已添加,但是,所有鼠标点击都会丢失,小部件不再响应。小部件是菜单项的组合,因此鼠标单击会导致菜单项丢弃,但它只是选择文本。

2 个答案:

答案 0 :(得分:13)

如果您的第一句中的“HTML元素”实际上是指“HTML小部件”,那么您应该使用HTMLPanel小部件,然后只需使用其add(Widget,String)add(Widget,Element)方法添加您的现有子元素中的小部件。

如果您实际上在谈论“具有现有父窗口小部件的窗口小部件可能未添加到分离列表”断言错误,那么从GWT 2.3开始,您现在可以wrap an existing DOM element within an HTMLPanel,然后使用与上述相同的add方法:

HTMLPanel container = HTMLPanel.wrap(Document.get().getElementById("container"));

答案 1 :(得分:3)

您使用DOM.getElementById()的方法是正确的。 GWT Widgets创建一个与DOM并行的对象树,因此您必须另外将此对象树“附加”到DOM以接收事件。这是通过onAttach()方法完成的。

不幸的是,此方法为protected,因此您无法直接调用它。解决方法是创建一个简单的Widget包装类并将其公开:

public void onAttach() {
    super.onAttach();
}

请注意,必须确保Widget在未显示时已分离,因为如果不这样做可能会泄漏内存。最简单的方法是拨打RootPanel.detachOnWindowClose(widget)

<强>更新

正如Thomas Broyer所说(并且他的话被视为“来源”) - 使用HTMLPanel.wrap(yourDivElement),因为这将正确地执行您需要它做的事情 - 将Widget附加到DOM树。

我建议的方法是hackish,只有当你实际编写一个新的Widget时我才会推荐它(因为我需要在我的一个项目中执行并在此处复制我的代码)。