2011-05-22 33 views
14

我有一個GWT CellTable<MyType>。這個表格有行,應該顯示CheckBox。這CheckBox應該選中或取消選中,取決於MyType中的吸氣劑,但它應該禁用,因此用戶不能點擊它。有人知道如何實施?禁用CellTable中的CheckboxCell

一些代碼片段:

Column<MyType, Boolean> checkboxColumn = new Column<MyType, Boolean>(new CheckboxCell()) { 
    @Override 
    public Boolean getValue(MyType object) { 
     return object.isItTrue(); 
    } 
}; 
CellTable<MyType> cellTable = new CellTable<MyType>(); 
cellTable.addColumn(checkboxColumn, "Header title");

回答

13

CheckboxCell不支持此功能,但你可以使自己的細胞,做。未經測試的代碼(大部分來自CheckboxCell代碼,版權Google(請參閱CheckboxCell源代碼))複製!重要的部分在渲染代碼中。你的新單元格將在Column<MyType, MyType>

public class DisableableCheckboxCell extends AbstractEditableCell<MyType> { 

    /** 
    * An html string representation of a checked input box. 
    */ 
    private static final SafeHtml INPUT_CHECKED = SafeHtmlUtils.fromSafeConstant("<input type=\"checkbox\" tabindex=\"-1\" checked/>"); 

    /** 
    * An html string representation of an unchecked input box. 
    */ 
    private static final SafeHtml INPUT_UNCHECKED = SafeHtmlUtils.fromSafeConstant("<input type=\"checkbox\" tabindex=\"-1\"/>"); 

    private static final SafeHtml INPUT_CHECKED_DISABLED = SafeHtmlUtils.fromSafeConstant("<input type=\"checkbox\" tabindex=\"-1\" checked disabled=\"disabled\"/>"); 

    private static final SafeHtml INPUT_UNCHECKED_DISABLED = SafeHtmlUtils.fromSafeConstant("<input type=\"checkbox\" tabindex=\"-1\" disabled=\"disabled\"/>"); 

/** You'd copy the rest of the code from CheckboxCell, or implement the other required functions yourself **/ 

    @Override 
    public void render(Context context, MyType value, SafeHtmlBuilder sb) { 
    // Get the view data. 
    Object key = context.getKey(); 
    MyType viewData = getViewData(key); 
    if (viewData != null && viewData.equals(value)) { 
     clearViewData(key); 
     viewData = null; 
    } 

    MyType relevantValue = viewData != null ? viewData : value; 
    boolean checked = relevantValue.shouldBeChecked(); 
    boolean enabled = relevantValue.shouldBeEnabled(); 

    if (checked && !enabled)) { 
     sb.append(INPUT_CHECKED_DISABLED); 
    } else if (!checked && !enabled) { 
     sb.append(INPUT_UNCHECKED_DISABLED); 
    } else if (checked && enabled) { 
     sb.append(INPUT_CHECKED); 
    } else if (!checked && enabled) { 
     sb.append(INPUT_UNCHECKED); 
    } 
} 
0

我想出了這個我自己簡單的解決方案。這不是太優雅,但它很容易實現。您的複選框將不會停用,但根本不會存在。下面是我做的:

private Column<SomeObject,Boolean> someColumn = new Column<SomeObject,Boolean>(new CheckboxCell()) { 
    @Override 
    public Boolean getValue(SomeObject object){ 
    return object.getSomeValue(); 
    } 
    @Override 
    public void render(Context context, SomeObject object, SafeHtmlBuilder sb){ 
    if (object.getSomeOtherValue()){ 
     super.render(context, object, sb); 
    } 
    } 
}; 

我乾脆重寫render方法,以使該複選框只對某些屬性的值定義的特定條件。