将GWT小部件插入到div元素中

Dea*_*ive 6 html gwt

我正在使用GWT库(gwt-openlayers),它允许我创建一个包含任意HTML的地图弹出窗口,类似于谷歌地图.我需要这个HTML来包含一个GWT Button小部件.

我正在创建一些HTML元素,如下所示:

Element outerDiv = DOM.createDiv();
outerDiv.getStyle().setOverflow(Overflow.HIDDEN);
outerDiv.getStyle().setWidth(100, Unit.PCT);
outerDiv.appendChild(new HTML(mapPOI.getHtmlDetails()).getElement());
Button popupButton = new Button("View Property");
popupButton.getElement().getStyle().setFloat(com.google.gwt.dom.client.Style.Float.RIGHT);
outerDiv.appendChild(popupButton.getElement());
Run Code Online (Sandbox Code Playgroud)

然后我通过调用获取这些元素的源HTML

String src = outerDiv.toString();
Run Code Online (Sandbox Code Playgroud)

并将此html插入我的地图标记.现在我的地图标记显示内容确定,包括按钮.但是,该按钮不会响应任何事件!从我可以收集到的,这是因为从未调用onAttach()方法按钮.

有一个更好的方法吗?

谢谢,

乔恩

~~~~编辑~~~~

我现在正在尝试一种新方法,这似乎是接受其他类似帖子的公认方法.

首先,我正在创建我的div:

String divId = "popup-" + ref;
String innerHTML = "<div id=\"" +divId + "\"></div>";
Run Code Online (Sandbox Code Playgroud)

然后我将它添加到我的地图弹出窗口并显示它(将其添加到DOM).显示弹出窗口后,我按如下方式获取Element,并尝试在其周围包装HTMLPanel:

Element element = Document.get().getElementById(divId);
HTMLPanel popupHTML = HTMLPanel.wrap(element);
Run Code Online (Sandbox Code Playgroud)

我的div元素已成功检索.但是,HTMLPanel.wrap(element);没有完成.原因是wrap(..)调用RootPanel.detachOnWindowClose(Widget widget),包括以下断言:

assert !widgetsToDetach.contains(widget) : "detachOnUnload() called twice "
    + "for the same widget";
assert !isElementChildOfWidget(widget.getElement()) : "A widget that has "
    + "an existing parent widget may not be added to the detach list";
Run Code Online (Sandbox Code Playgroud)

我提出了一些断点,似乎第二个断言失败了!

有没有人知道为什么会这样?如果失败,这个断言真的会导致方法完全失败(不返回)吗?

cod*_*sta 5

您的第一种方法很好,您只需为按钮注册 onClick 事件,如下所示:

DOM.sinkEvents(popupButton.getElement(), Event.ONCLICK);
DOM.setEventListener(popupButton.getElement(), new EventListener() {
    @Override
    public void onBrowserEvent(Event event) {
        //implement the logic after click
    }
});
Run Code Online (Sandbox Code Playgroud)

我已经检查过了,100%有效!