Как добавить пользовательский виджет к элементу

GWT RootPanel.get( "id" ) не возвращает мне теги div, которые встроены в элементы HTML.

ех. & Л; тело > < & таблицы GT; < & тр GT; < & тд GT; < div id = "x" / > <td> ...</table> ...

Как получить доступ к этому тегу div и "Добавить виджет".

Одна из вещей, которую я пробовал, заключалась в том, чтобы получить элемент из виджета или widget.getElement() и добавить это к добавлению этого элемента к элементу, полученному из DOM.getElementById().

Виджет добавляется, однако все щелчки мыши теряются, а виджет больше не отвечает. Виджет представляет собой составной элемент меню, поэтому щелчки мыши вызывают падение пункта меню, но он просто выбирает текст.

Ответ 1

Если по "HTML-элементу" в вашем первом предложении вы действительно имеете в виду "HTML-виджет", вместо этого вы должны использовать виджет HTMLPanel, а затем просто используйте его метод add(Widget,String) или add(Widget,Element), чтобы добавить ваш виджет в существующую суб-элемент.

Если вы действительно говорите о том, что "виджет с существующим родительским виджетам не может быть добавлен в сообщение об отставке", тогда, начиная с GWT 2.3, теперь вы можете обернуть существующий элемент DOM в HTMLPanel, а затем использовать те же методы add, как указано выше:

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

Ответ 2

Ваш подход с DOM.getElementById() является правильным. Виджеты GWT создают дерево объектов параллельно DOM, поэтому вам нужно дополнительно "привязать" это дерево объектов к DOM для получения событий. Это делается с помощью метода onAttach().

К сожалению, этот метод protected, поэтому вы не можете его напрямую вызвать. Обходной путь состоит в том, чтобы создать простой класс оболочки Widget и сделать его общедоступным:

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

Обратите внимание, что вы должны убедиться, что Widget отсоединен, когда он больше не показан, поскольку это не может привести к утечке памяти. Самый простой способ сделать это - вызвать RootPanel.detachOnWindowClose(widget).

Update:

Как сказал Томас Бройер (и его слова следует рассматривать как "источник" ) - используйте HTMLPanel.wrap(yourDivElement), так как это будет правильно делать то, что вам нужно для этого - присоединить виджет к дереву DOM.

Мой предложенный подход хакерский, и я бы рекомендовал его, только если вы на самом деле пишете новый виджет (как мне нужно было сделать в одном из моих проектов и скопировать мой код здесь).