2014-07-21 36 views
0

好吧,我有一個IndexedColumn我們可以在GWT的同一列上同時擁有ClickableTextCell和ButtonCell嗎?

public class IndexedColumn extends Column<List<String>, String>{ 
    public IndexedColumn(int index){ 
     super(new ClickableTextCell()); // by default it is ClickableTextCell 
    } 
} 

當創建列

IndexedColumn objectColumn=new IndexedColumn(6){ 
    @Override 
    public String getCellStyleNames(Context context, List<String> object) { 
     if (object.get(12).equals("button")){ 
      return getView().getRes().css().gwtCellButton(); 
     } 
     else if(object.get(12).equals("1")){ 
      return getView().getRes().css().redColor(); 
     } 
     return getView().getRes().css().myClickableTextCellStyle(); 
    } 
} 

// CSS

.myClickableTextCellStyleBold{ 
    font-weight:bold; 
} 
.myClickableTextCellStyleNormal{ 
    font-weight:normal !important; 
} 

.myClickableTextCellStyle, .myClickableTextCellStyleBold, .myClickableTextCellStyleNormal 
{ 
    cursor: pointer; 
    cursor: hand; 
} 
.gwt-Button, .gwtCellButton button, .gwtCellButtonSmall button { 
    margin: 0; 
    padding: 5px 7px; 
    text-decoration: none; 
    cursor: pointer; 
    cursor: hand; 
    font-size:small; 
    background: black; 
    border:1px solid #bbb; 
    border-bottom: 1px solid #a0a0a0; 
    border-radius: 3px; 
-moz-border-radius: 3px; 
    color: white; 

} 

跑後,它可以拿起getView().getRes().css().redColor()但沒有回暖getView().getRes().css().gwtCellButton()

是否有可能在同一列上同時擁有ClickableTextCell和ButtonCell,如果是,那麼該怎麼做?

回答

0

您將不得不爲兩個類(即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); 

下面的類實現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); 
} 

} 

您也可以爲Button創建一個類似的類。對於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>");    
} 

最後將它們添加到複合單元:

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

總結它,你將不得不使用這又採用了複合細胞HasCell實現列表。

+0

我們可以有更簡單的解決方案嗎? – Tum

+0

代碼太多,我輸了 – Tum

相關問題