Java gwt应用程序中的复合单元

Java gwt应用程序中的复合单元,java,gwt,cell,celltable,Java,Gwt,Cell,Celltable,我正在尝试创建一个CompositeCell,它由一个TextCell和一个ButtonCell组成。我想将CompositeCell添加到列中,然后将该列添加到CellTable中。但是,我无法理解该列的实例应该是什么样的。特别是,我在以下代码中找不到其类型参数: Column<FilterInfo, ?> compositeColumn = new Column<FilterInfo, ?>(createCompositeCell()) { @Override

我正在尝试创建一个CompositeCell,它由一个TextCell和一个ButtonCell组成。我想将CompositeCell添加到列中,然后将该列添加到CellTable中。但是,我无法理解该列的实例应该是什么样的。特别是,我在以下代码中找不到其类型参数:

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

  @Override
  public Object getValue(Object object) {
    // TODO Auto-generated method stub
    return null;
  }}; 
Column compositeColumn=新列(createCompositeCell()){
@凌驾
公共对象getValue(对象对象){
//TODO自动生成的方法存根
返回null;
}}; 
创建自定义类FilterInfo的CompositeCell(有必要吗?)的方法是:

private CompositeCell createCompositeCell(){
HasCell filterName=新的HasCell(){
公共单元getCell(){
返回新的TextCell();
}
公共字段更新程序getFieldUpdater(){
//TODO自动生成的方法存根
返回null;
}
公共字符串getValue(FilterInfo对象){
返回object.getFilterName();
}};
HasCell filterButton=新的HasCell(){
公共单元getCell(){
返回新的ButtonCell();
}
公共字段更新程序getFieldUpdater(){
//TODO自动生成的方法存根
返回null;
}
公共字符串getValue(FilterInfo对象){
//TODO自动生成的方法存根
返回“…”;
}
};
列表单元格=新的ArrayList();
单元格。添加(过滤器名称);
单元格。添加(filterButton);
CompositeCell CompositeCell=新的CompositeCell(单元格);
返回复合池;
}


如果有任何迹象表明需要修改代码或其他建议以创建所需的CompositeCell并将其正确添加到CellTable中,我将不胜感激

如果您的
单元格表
包含
过滤器信息列表
,而您的
单元格
包含
过滤器信息
,则使用
标识列

是否必须使用复合单元格?对我来说,这似乎是一个很大的工作,它可能更容易创建自己的自定义单元

阅读

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


不要在这里过多地关注类型参数。 您的IDE太智能,会给您输入错误。它会抱怨“Raw Type.XXX应该参数化”,但是您应该能够以这种方式编译和运行代码

下面是一个代码,其中包含一个包含N个按钮的CompositeCell列:

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);
}
私有列getButtonColumn(){
返回新列(getButtonsCell()){
@凌驾
公共DTO getValue(DTO对象){
返回对象;
}
};
} 
私有CompositeCell getButtonsCell(){
HasCell button1=新的AbstractActionButton(){
@凌驾
公共void执行(最终DTO对象){
//单击按钮时的操作
}
@凌驾
公共void呈现(上下文上下文、DTO数据、安全HtmlBuilder sb){
//
}
};
HasCell button2=新建AbstractActionButton(){
//完成我。。。
}
列表单元格=新建LinkedList();
单元格。添加(按钮1);
单元格。添加(按钮2);
CompositeCell CompositeCell=新的CompositeCell(单元格);
返回复合池;
}
公共抽象类AbstractActionButton实现了HasCell{
@凌驾
公共单元getCell(){
返回新的ActionCell(“按钮标题”,new ActionCell.Delegate(){
@凌驾
公共void执行(DTO对象){
AbstractActionButton.this.execute(对象);
}
}) {
@凌驾
公共void呈现(上下文上下文、DTO数据、安全HtmlBuilder sb){
AbstractActionButton.this.render(上下文、数据、sb);
}
};
}
//已替换为委托,但仍需要重写
@凌驾
公共字段更新程序getFieldUpdater(){
返回null;
}
@凌驾
公共DTO getValue(DTO对象){
返回对象;
}
/**
*您可以重写此方法以不同方式呈现按钮。这不是强制性的
*@param上下文
*@param数据
*@param某人
*/
公共抽象void呈现(上下文、DTO数据、安全HTMLBuilder sb);
/**
*单击按钮时调用
*@param对象
*/
公共抽象无效执行(DTO对象);
}

我试过这个,可以用自定义单元格完成。好办法。
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);
}