2012-08-13 11 views
5

Intento crear una CompositeCell que consta de una TextCell y una ButtonCell. Deseo agregar CompositeCell a Column ordinariamente y luego Column a CellTable. Sin embargo, no puedo descifrar cómo debería ser la instancia de la columna. En particular, no puedo encontrar sus parámetros de tipo en el siguiente código:Célula compuesta en una aplicación gwt

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

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

El método que crea el CompositeCell de la clase personalizada FilterInfo (¿es necesario?) Es:

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; 

}

Agradecería cualquier indicación para adaptar el código u otra sugerencia para crear la CompositeCell deseada y agregarla correctamente a la CellTable.

Respuesta

3

¿Tienes que usar una celda compuesta? Para mí esto parece mucho trabajo, y puede ser mucho más fácil crear tu propia celda personalizada.

tener una lectura de la documentación sobre Creating Custom Cells

+0

Probé esto y se puede hacer con la célula de medida. Buen enfoque. – arjacsoh

1

Si su CellTable toma una lista de FilterInfo y su Cell toma un FilterInfo, a continuación, utilizar un IdentityColumn.

0

creé una compositecell (Checkboxcell + TextCell) mediante el uso de GXT XTemplate para hacer que el texto de la celda de texto. Use Template si desea adherirse a GWT puro y también reemplazar otros widgets GXT con GWT.

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

2

No trate de centrarse demasiado en el parámetro de tipo aquí. Su IDE es demasiado inteligente y le dará error tipográfico. Se quejará de que "Raw Type. XXX < C> debe parametrizarse", sin embargo, debería poder compilar y ejecutar el código de esa manera.

Aquí es un código para tener una columna con un CompositeCell de N botones:

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); 
} 
Cuestiones relacionadas