2010-11-13 38 views
17

我想創建一個組件來裝飾它的孩子,如:如何使用uibinder爲兒童創建gwt複合組件?

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中,如果我必須)

回答

33

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> 

會以這種方式工作。

+0

非常感謝非常完整的答案。 – 2010-11-14 12:45:23

+0

沒有問題,不客氣。 – z00bs 2010-11-14 12:46:21

+0

我一直在尋找一個簡單的方法來做到這一點。謝謝! – roguenet 2011-11-16 00:58:42

1

使用這個XML:

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

將實例MyComponent,然後調用MyComponent.add(label)。您所要做的就是在您的課程MyComponent中覆蓋.add(..)並應用您想要傳遞組件的任何樣式。