5

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

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

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

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

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 中,我将不胜感激。

4

4 回答 4

3

你必须使用复合细胞吗?对我来说,这似乎需要做很多工作,而且创建自己的自定义单元格可能会容易得多。

阅读有关创建自定义单元的文档

于 2012-08-14T17:21:39.090 回答
2

不要试图过多地关注这里的类型参数。你的 IDE 太聪明了,会给你输入错误。它会抱怨“原始类型。应该参数化 XXX<C>”但是您应该能够以这种方式编译和运行代码。

这是一个包含 N 个按钮的 CompositeCell 的 Column 的代码:

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);
}
于 2015-03-12T12:51:46.223 回答
1

如果你CellTable需要一个列表FilterInfo并且你Cell需要一个FilterInfo,那么使用一个IdentityColumn

于 2012-08-13T21:37:56.303 回答
0

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

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

于 2013-02-14T01:50:33.037 回答