Подтвердить что ты не робот

Как создать составной компонент gwt с детьми, используя uibinder?

Я хотел бы создать компонент для украшения своих дочерних элементов, например:

mycomponent.ui.xml:

<g:FlowPanel addStyleNames="myStyle">
    <!-- how can i render children ? -->
</g:FlowPanel>

а затем другие могут использовать:

<myapp:mycomponent>
    <g:Label>Decorated child</g:Label>
</myapp:mycomponent>

Как я могу сделать детей в uibinder? (или в Java, если я должен)

4b9b3361

Ответ 1

Пусть MyComponent реализует интерфейс HasWidgets для добавления/удаления дочерних виджетов.

MyComponent.ui.xml выглядит так же просто, как

<g:FlowPanel ui:field="main" />

пока вы делегируете методы, указанные ind HasWidgets, на FlowPanel:

public class MyComponent extends Composite implements HasWidgets {

    private static MyComponentUiBinder uiBinder = GWT.create(MyComponentUiBinder.class);

    interface MyComponentUiBinder extends UiBinder<Widget, MyComponent> {}

    @UiField
    FlowPanel main;

    public MyComponent() {
        initWidget(uiBinder.createAndBindUi(this));
    }

    @Override
    public void add(Widget w) {
        main.add(w);
    }

    @Override
    public void clear() {
        main.clear();
    }

    @Override
    public Iterator<Widget> iterator() {
        return main.iterator();
    } 

    @Override
    public boolean remove(Widget w) {
        return main.remove(w);
    }
}

Вызов

<M:MyComponent>
    <g:Label text="some text" />
</M:MyComponent>

будет работать таким образом.

Ответ 2

Использование этого XML:

<myapp:mycomponent>
    <g:Label>Decorated child</g:Label> 
</myapp:mycomponent>

создаст экземпляр MyComponent, а затем вызовет MyComponent.add(label). Все, что вам нужно сделать, это переопределить .add(..) в вашем классе MyComponent и применить любые стили, которые вы хотите передать компонентам.