Definindo Células GWT com UiBinder

9

Se eu definir minha CellTable no arquivo UiBinder MyView.ui.xml assim:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:c="urn:import:com.google.gwt.user.cellview.client"
ui:generateFormat='com.google.gwt.i18n.rebind.format.PropertiesFormat'
ui:generateKeys='com.google.gwt.i18n.rebind.keygen.MD5KeyGenerator'
ui:generateLocales='default' xmlns:p1="urn:import:com.google.gwt.user.cellview.client">
        ...
    <g:HTMLPanel>           
      <c:CellTable
        addStyleNames='{style.cellTable}'
        pageSize='15'
        ui:field='cellTable' width="100%">  
       </c:CellTable>           
    </g:HTMLPanel>

e, em seguida, programaticamente adicionar as colunas para o CellTable, tudo funciona bem.

Mas, na tentativa de reduzir o código clichê, gostaria de definir também as colunas da tabela no meu arquivo UiBinder. Eu tentei isso:

    ...
    <g:HTMLPanel>           
      <c:CellTable
        addStyleNames='{style.cellTable}'
        pageSize='15'
        ui:field='cellTable' width="100%">  
            <c:TextColumn 
                addStyleNames='{style.titleColumn}'
                ui:field="titleColumn"/>
       </c:CellTable>           
    </g:HTMLPanel>

Mas produz o seguinte erro:

  

[ERRO] [dialetivo] - Elemento filho inesperado encontrado Elemento addStyleNames = '{style.titleColumn}' ui: field = 'titleColumn' > (: 33)

Como eu poderia definir toda a CellTable usando o UiBinder?

    
por Mike 02.08.2012 в 12:16
fonte

1 resposta

5

Evidentemente, na segunda listagem, você está tentando adicionar uma coluna como um objeto filho. A tabela de células não aceita crianças diretamente (ou seja, não há método addChild (...)).

Se você tiver um número fixo de colunas e quiser usar o UIBinder, considere o uso de uma simples tabela HTML. Nesse caso, você terá todas as colunas no arquivo XML, mas a tabela se tornará mais difícil de trabalhar - HtmlElement não Widget.

<table ui:field="table">
    <col ui:field="firstColumn" class="{style.firstColumn}">
    <col ui:field="secondColumn"  class="{style.secondColumn}">
    ...
</table>

E o código pode parecer com o seguinte

... 
@UiField
private TableColElement firstColumn;

@UiField
private TableColElement secondColumn;

Mas todas as outras operações com a tabela serão via DOM. Como table.appentChild (rowElement). Eu acho que fazer assim não vale a pena.

    
por Vic 06.08.2012 / 20:08
fonte