2012-08-13 37 views
5

我正尝试创建一个由TextCell和ButtonCell组成的CompositeCell。我想通常将CompositeCell添加到列,然后将列添加到CellTable。但是我无法弄清楚列的实例应该如何。特别是我不能在下面的代码找到它的类型参数:gwt应用程序中的复合单元格

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

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

它创建自定义类的CompositeCell方法FilterInfo(是否有必要?)是:

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; 

}

任何适应代码或其他建议以创建所需的CompositeCell并将其正确添加到CellTable的任何指示,我将不胜感激。

回答

3

您是否必须使用复合单元?对我来说,这看起来很多工作,而且创建自己的自定义单元格可能会更容易。

有文档上Creating Custom Cells

+0

我尝试这样做,它可以与自定义单元来完成。好方法。 – arjacsoh 2012-08-15 10:02:54

1

如果您CellTable需要的FilterInfo一个列表和Cell需要FilterInfo,然后使用IdentityColumn

0

读我使用GXT XTemplate呈现文本单元格的文本创建一个compositecell(Checkboxcell + TextCell)。如果您想坚持纯GWT并使用GWT替换其他GXT小部件,请使用模板。

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

2

不要把注意力过多的类型参数在这里。 你的IDE太聪明,会给你输入错误。它会抱怨“Raw Type。XXX < C>应该被参数化”,但是你应该能够通过这种方式编译和运行代码。

这里是具有与的CompositeCell N A按钮的列的代码:

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