如何使用uibinder创建一个带子项的gwt复合组件?

时间:2010-11-13 23:11:37

标签: java 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中,如果必须的话)

2 个答案:

答案 0 :(得分:33)

MyComponent实现HasWidgets界面以添加/删除子窗口小部件。

MyComponent.ui.xml看起来像

一样简单
<g:FlowPanel ui:field="main" />

将您指定的方法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>

将以这种方式工作。

答案 1 :(得分:1)

使用此XML:

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

将实例化MyComponent,然后调用MyComponent.add(label)。您所要做的就是覆盖班级.add(..)中的MyComponent并应用您要传递组件的任何样式。