#gwt
#gwt
Вопрос:
У меня есть 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 amp;amp; viewData.equals(value)) {
clearViewData(key);
viewData = null;
}
MyType relevantValue = viewData != null ? viewData : value;
boolean checked = relevantValue.shouldBeChecked();
boolean enabled = relevantValue.shouldBeEnabled();
if (checked amp;amp; !enabled)) {
sb.append(INPUT_CHECKED_DISABLED);
} else if (!checked amp;amp; !enabled) {
sb.append(INPUT_UNCHECKED_DISABLED);
} else if (checked amp;amp; enabled) {
sb.append(INPUT_CHECKED);
} else if (!checked amp;amp; 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);
}
}
};
Я просто переопределил метод render, чтобы отображать флажок только при определенном условии, определяемом значением некоторого атрибута.