2012-08-13 7 views
5

Ich versuche, eine CompositeCell zu erstellen, die aus einer TextCell und einer ButtonCell besteht. Ich möchte die CompositeCell Spalte normalerweise und dann die Spalte zu einer CellTable hinzufügen. Ich bin jedoch nicht in der Lage herauszufinden, wie die Instanz der Spalte sein soll. Insbesondere kann ich nicht seine Art Parameter im folgenden Code finden:Zusammengesetzte Zelle in einer gwt-Anwendung

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

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

Das Verfahren, das das CompositeCell der benutzerdefinierten Klasse erstellt filter (ist es notwendig?) Ist:

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; 

}

Ich wäre dankbar bei jedem Hinweis, den Code oder einen anderen Vorschlag anzupassen, um die gewünschte CompositeCell zu erstellen und sie der CellTable richtig hinzuzufügen.

Antwort

3

Müssen Sie eine zusammengesetzte Zelle verwenden? Für mich scheint das eine Menge Arbeit zu sein, und es kann viel einfacher sein, eine eigene benutzerdefinierte Zelle zu erstellen.

Haben Sie ein Lesen der Dokumentation auf Creating Custom Cells

+0

ich das versucht, und es kann mit benutzerdefinierter Zelle durchgeführt werden. Guter Ansatz. – arjacsoh

1

Wenn Ihr CellTable eine Liste von FilterInfo nimmt und Ihre Cell nimmt einen FilterInfo, dann eine IdentityColumn verwenden.

0

I unter Verwendung GXT XTemplate zu machen, den Text der Textzelle eine compositecell (Checkboxcell + TextCell) erstellt. Verwenden Sie Template, wenn Sie bei reinem GWT bleiben und auch andere GXT-Widgets durch GWT ersetzen möchten.

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

2

Versuchen Sie nicht zu sehr auf den Typ-Parameter hier zu konzentrieren. Ihre IDE ist zu schlau und gibt Ihnen einen Typfehler. Es wird sich beschweren "Raw Type. XXX < C> sollte parametrisiert werden", aber Sie sollten in der Lage sein, Code auf diese Weise zu kompilieren und auszuführen.

Hier ist ein Code, der eine Säule mit einem CompositeCell von N Tasten hat:

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