2010-11-13 21 views
17

me gustaría crear un componente para decorar sus hijos, tales como:¿Cómo crear un componente compuesto gwt con niños usando uibinder?

mycomponent.ui.xml:

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

y otros pueden utilizar:

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

¿Cómo puedo entregar a los niños en uibinder? (O en Java, si es preciso)

Respuesta

33

Deje MyComponent implementar la interfaz HasWidgets para agregar/eliminar widgets secundarios.

El MyComponent.ui.xml se ve tan simple como

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

mientras que el delegado de los métodos especificados ind HasWidgets a la 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); 
    } 
} 

Calling

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

va a funcionar de esta manera.

+0

Muchas gracias por la respuesta muy completa. –

+0

No hay problema, de nada. – z00bs

+0

He estado buscando una manera simple de hacer esto. ¡Gracias! – roguenet

1

El uso de este XML:

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

creará una instancia MyComponent y luego llamar MyComponent.add(label). Todo lo que tiene que hacer es anular .add(..) en su clase MyComponent y aplicar los estilos que desee pasar los componentes.

Cuestiones relacionadas