Отключить CheckboxCell в CellTable

У меня есть GWT CellTable<MyType>. В этой таблице есть строки, которые должны отображать CheckBox. Этот CheckBox должен быть отмечен или не установлен в зависимости от получателя в MyType, но он должен быть отключен, чтобы пользователь не мог его щелкнуть. Кто-нибудь знает, как это можно реализовать?

Некоторые фрагменты кода:

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");

Ответы

Ответ 1

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

Ответ 2

Я придумал свое собственное простое решение для этого. Это не слишком элегантно, но очень легко реализовать. Ваш флажок не будет деактивирован, но его просто не будет. Вот что я сделал:

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

Я просто переопределяю метод рендеринга, чтобы визуализировать CheckBox только при определенном условии, определяемом значением некоторого атрибута.