К сожалению, IIRC вы не можете установить идентификатор для виджета в коде UiBinder (я думаю, что вы можете только для обычного HTML). Таким образом, вы можете установить правильный идентификатор с помощью someWidget.getElement().setId()
(как вы сделали в коде выше).
То, что сейчас не хватает, я думаю, это заполнитель (div, span и т. Д.) С правильным идентификатором в HTMLPanel referencePanel
, например:
<g:HTMLPanel ui:field="referencePanel">
<div ui:field="referencePanelInner" />
</g:HTMLPanel>
А в AppUIDemo
:
@UiField
DivElement referencePanelInner;
// ...
public AppUIDemo() {
// ...
referencePanelInner.setId(reference.getRefPanelId());
}
... если вы не хотите добавить ReferenceUI непосредственно в referencePanel
- в этом случае вы должны просто использовать FlowPanel
:)
PS: ИМХО, вы должны сгенерировать и установить уникальный идентификатор для ReferenceUI.refPanel
из класса ReferenceUI
(и предоставить идентификатор) - чтобы вы не связывались с «внутренностями» виджета из некоторых внешних виджетов .
Хорошо, я думаю, что понял. Исключение IllegalStateException
генерируется, потому что вы добавляете ReferenceUI.refPanel
(или ReferenceUI.referencePanel
, я не знаю, какое имя является текущим) к AppUIDemo
(ReferenceUI
, очевидно, не реализует HasWidgets
) - когда вам нужно добавить весь ReferenceUI reference
композит :) Я не знаю, почему вы сделали это таким образом (возможно, из-за всей путаницы с идентификаторами), но код должен выглядеть примерно так:
public AppUIDemo() {
initWidget(uiBinder.createAndBindUi(this));
ReferenceUI reference = new ReferenceUI(refUIBinder);
referencePanel.add(reference);
}