2012-08-13 13 views
5

Sto provando a creare un CompositeCell che consiste in un TextCell e un ButtonCell. Voglio aggiungere ordinariamente il CompositeCell alla colonna e quindi la colonna a una tabella delle celle. Tuttavia non sono in grado di capire come dovrebbe essere l'istanza della colonna. In particolare non riesco a trovare i suoi parametri di tipo nel codice seguente:Cellula composita in un'applicazione gwt

Column<FilterInfo, ?> compositeColumn = new Column<FilterInfo, ?>(createCompositeCell()) { 

    @Override 
    public Object getValue(Object object) { 
    // TODO Auto-generated method stub 
    return null; 
    }}; 

Il metodo che crea il CompositeCell della classe personalizzata FilterInfo (è necessario?) È:

private CompositeCell<FilterInfo> createCompositeCell(){ 

HasCell<FilterInfo, String> filterName = new HasCell<FilterInfo, String>() { 

    public Cell<String> getCell() { 
    return new TextCell(); 
    } 

    public FieldUpdater<FilterInfo, String> getFieldUpdater() { 
    // TODO Auto-generated method stub 
    return null; 
    } 

    public String getValue(FilterInfo object) { 
    return object.getFilterName(); 
    }}; 

    HasCell<FilterInfo, String> filterButton = new HasCell<FilterInfo,String>(){ 

    public Cell<String> getCell() { 
     return new ButtonCell(); 
    } 

    public FieldUpdater<FilterInfo, String> getFieldUpdater() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public String getValue(FilterInfo object) { 
     // TODO Auto-generated method stub 
     return "..."; 
    } 
    }; 

    List<HasCell<FilterInfo, ?>> cells = new ArrayList<HasCell<FilterInfo, ?>>(); 
    cells.add(filterName); 
    cells.add(filterButton); 

    CompositeCell<FilterInfo> compositeCell = new CompositeCell<FilterInfo>(cells); 

    return compositeCell; 

}

Sarei grato da qualsiasi indicazione per adattare il codice o un altro suggerimento per creare il CompositeCell desiderato e per aggiungerlo correttamente a CellTable.

risposta

3

Devi utilizzare una cella composita? Per me questo sembra un sacco di lavoro, e potrebbe essere molto più semplice creare la tua cella personalizzata.

Avere una lettura della documentazione di Creating Custom Cells

+0

Ho provato questo e può essere fatto con cella personalizzato. Buon approccio – arjacsoh

1

Se il CellTable prende una lista di FilterInfo e la vostra Cell prende un FilterInfo, quindi utilizzare un IdentityColumn.

0

ho creato un compositecell (Checkboxcell + TextCell) utilizzando GXT XTemplate per il rendering del testo della cella di testo. Usa Template se vuoi aderire al GWT puro e sostituire anche altri widget GXT con GWT.

https://gist.github.com/Aadi1/4949994

2

Non cercare di concentrarsi troppo sul parametro di tipo qui. Il tuo IDE è troppo intelligente e ti darà un errore di tipo. Si denuncerà "Raw Type. XXX < C> dovrebbe essere parametrizzato", tuttavia dovresti essere in grado di compilare ed eseguire il codice in questo modo.

Ecco un codice per avere una colonna con un CompositeCell di N pulsanti:

private Column<DTO, DTO> getButtonColumn() { 
    return new Column<DTO, DTO>(getButtonsCell()) { 
     @Override 
     public DTO getValue(DTO object) { 
      return object; 
     } 
    }; 
} 

private CompositeCell getButtonsCell() { 
    HasCell<DTO,DTO> button1 = new AbstractActionButton<DTO>() { 
       @Override 
       public void execute(final DTO object) { 
        //Action on button click 
       } 

       @Override 
       public void render(Context context, DTO data, SafeHtmlBuilder sb) { 
        // 
       } 
      }; 
    HasCell<DTO,DTO> button2 = new AbstractActionButton<DTO>(){ 
     //Complete me ... 
    } 

    List<HasCell<DTO, ?>> cells = new LinkedList<>(); 
    cells.add(button1); 
    cells.add(button2); 
    CompositeCell<DTO> compositeCell = new CompositeCell<>(cells); 

    return compositeCell; 
} 


public abstract class AbstractActionButton<DTO> implements HasCell<DTO, DTO> { 

@Override 
public Cell<DTO> getCell() { 
    return new ActionCell<DTO>("Button title", new ActionCell.Delegate<DTO>() { 
     @Override 
     public void execute(DTO object) { 
      AbstractActionButton.this.execute(object); 
     } 
    }) { 
     @Override 
     public void render(Context context, DTO data, SafeHtmlBuilder sb) { 
      AbstractActionButton.this.render(context, data, sb); 
     } 
    }; 
} 

//Replaced by delegate but still need to be overriden 
@Override 
public FieldUpdater<DTO, DTO> getFieldUpdater() { 
    return null; 
} 

@Override 
public DTO getValue(DTO object) { 
    return object; 
} 

/** 
* You can override this method to render your button differently. Not mandatory 
* @param context 
* @param data 
* @param sb 
*/ 
public abstract void render(Context context, DTO data, SafeHtmlBuilder sb); 

/** 
* Called when the button is clicked 
* @param object 
*/ 
public abstract void execute(DTO object); 
}