我们可以在GWT的同一列上同时使用ClickableTextCell和ButtonCell吗?

我们可以在GWT的同一列上同时使用ClickableTextCell和ButtonCell吗?,gwt,gwtp,Gwt,Gwtp,好的,我有一个IndexedColumn public class IndexedColumn extends Column<List<String>, String>{ public IndexedColumn(int index){ super(new ClickableTextCell()); // by default it is ClickableTextCell } } 运行后,它可以选择getView().getRes().c

好的,我有一个
IndexedColumn

public class IndexedColumn extends Column<List<String>, String>{
    public IndexedColumn(int index){
       super(new ClickableTextCell()); // by default it is ClickableTextCell
    }
}
运行后,它可以选择
getView().getRes().css().redColor()
,但没有选择
getView().getRes().css().gwtCellButton()


是否可以在同一列上同时使用ClickableTextCell和ButtonCell,如果可以,那么如何操作?

您必须为两个类(即TextCell和ButtonCell)实现
HasCell
接口,然后使用
CompositeCell
将两个(或更多)单元格组合在一起

使用以下类别:

public abstract class CustomTextCell<T> extends AbstractCell<String> {

private T object;
private Set<String> set ;

@Override
public Set<String> getConsumedEvents() {
    set = new HashSet<String>();
    set.add("click");
    set.add("keydown");
    return set;
}

public void setObject(T object) {
    this.object = object;

}

@Override
protected void onEnterKeyDown(Context context, Element parent, String value,
        NativeEvent event, ValueUpdater<String> valueUpdater) {
    doAction(value, valueUpdater,object);
}

@Override
public void onBrowserEvent(Context context, Element parent,
        String value, NativeEvent event,
        ValueUpdater<String> valueUpdater) {
    super.onBrowserEvent(context, parent, value, event, valueUpdater);

    if ("click".equals(event.getType())) {
        EventTarget eventTarget = (EventTarget) event.getEventTarget();
        if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
            doAction(value, valueUpdater,object);
        }
    }
}

protected abstract void doAction(String value, ValueUpdater<String> valueUpdater,T object);
公共抽象类CustomTextCell扩展了AbstractCell{
私人T对象;
私有集;
@凌驾
公共集getConsumedEvents(){
set=新的HashSet();
设置。添加(“单击”);
设置。添加(“键控”);
返回集;
}
公共无效集合对象(T对象){
this.object=对象;
}
@凌驾
受保护的void onEnterKeyDown(上下文上下文、元素父元素、字符串值、,
NativeEvent事件,ValueUpdater(ValueUpdater){
doAction(值、值更新程序、对象);
}
@凌驾
public void onBrowserEvent(上下文、元素父级、,
字符串值,NativeEvent事件,
ValueUpdater(ValueUpdater){
onBrowserEvent(上下文、父级、值、事件、值更新程序);
如果(“单击“.equals(event.getType())){
EventTarget EventTarget=(EventTarget)event.getEventTarget();
if(parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))){
doAction(值、值更新程序、对象);
}
}
}
受保护的抽象void doAction(字符串值、ValueUpdater ValueUpdater、T对象);
下面的类实现了HasCell接口

public abstract class ClickableTextCellHasCellImpl<T> implements HasCell<T, String> {

private FieldUpdater<T, String> fieldUpdater;
private T object;
private CustomTextCell<T> cell = new CustomTextCell<T>() {

    @Override
    protected void doAction(String value,
            ValueUpdater<String> valueUpdater, T object) {
        onTextClick(object);
    }

    @Override
    public void render(com.google.gwt.cell.client.Cell.Context context,
            String value, SafeHtmlBuilder sb) {
        sb.appendHtmlConstant("<h4>"+ getValue(object)+"</h4>");            
    }

};

protected abstract void onTextClick(T object);

@Override
public Cell<String> getCell() {
    return cell;
}

@Override
public FieldUpdater<T, String> getFieldUpdater() {
    return fieldUpdater;
}


public void setFieldUpdater(FieldUpdater<T, String> fieldUpdater){
    this.fieldUpdater=fieldUpdater;
}

@Override
public abstract String getValue(T object);

public void setObjectValue(T object){
    this.object = object;
    cell.setObject(object);
}

}
公共抽象类ClickableTextCellHasCellImpl实现HasCell{
私有FieldUpdater FieldUpdater;
私人T对象;
私有CustomTextCell单元格=新CustomTextCell(){
@凌驾
受保护的无效操作(字符串值,
ValueUpdater ValueUpdater,T对象){
onTextClick(对象);
}
@凌驾
public void render(com.google.gwt.cell.client.cell.Context),
字符串值,安全HtmlBuilder sb){
sb.appendHtmlConstant(“+getValue(object)+”);
}
};
受保护的抽象void onTextClick(T对象);
@凌驾
公共单元getCell(){
返回单元;
}
@凌驾
公共字段更新程序getFieldUpdater(){
返回字段更新程序;
}
public void setFieldUpdater(FieldUpdater FieldUpdater){
this.fieldUpdater=fieldUpdater;
}
@凌驾
公共抽象字符串getValue(T对象);
公共无效setObjectValue(T对象){
this.object=对象;
cell.setObject(object);
}
}
您也可以为按钮创建类似的类。对于ButtonHasCellImpl,只需将渲染方法更改为:

@Override
public void render(com.google.gwt.cell.client.Cell.Context context,
        String value, SafeHtmlBuilder sb) {
        sb.appendHtmlConstant("<button type=\"button\">"+ getValue(object)+"</button>");            
}
@覆盖
public void render(com.google.gwt.cell.client.cell.Context),
字符串值,安全HtmlBuilder sb){
sb.appendHtmlConstant(“+getValue(object)+”);
}
最后将它们添加到复合单元格中:

CompositeCell compositeCell = new CompositeCell(hasCellImplLst);

    Column<MyObject, String> compColum = new Column<MyObject, String>(compositeCell) {

        @Override
        public String getValue(MyObject object) {
            textCell.setObjectValue(object);
            buttonCell.setObjectValue(object);
            return null;
        }
    };
CompositeCell-CompositeCell=新的CompositeCell(hasCellImplLst);
列组件=新列(compositeCell){
@凌驾
公共字符串getValue(MyObject对象){
textCell.setObjectValue(对象);
buttonCell.setObjectValue(对象);
返回null;
}
};

总而言之,您必须使用一个复合单元,而复合单元又使用一个HasCell实现列表。

我们能有一个更简单的解决方案吗?
@Override
public void render(com.google.gwt.cell.client.Cell.Context context,
        String value, SafeHtmlBuilder sb) {
        sb.appendHtmlConstant("<button type=\"button\">"+ getValue(object)+"</button>");            
}
CompositeCell compositeCell = new CompositeCell(hasCellImplLst);

    Column<MyObject, String> compColum = new Column<MyObject, String>(compositeCell) {

        @Override
        public String getValue(MyObject object) {
            textCell.setObjectValue(object);
            buttonCell.setObjectValue(object);
            return null;
        }
    };