Учитывая два CheckboxCellcheckboxA и checkboxB, как я могу программно снять флажок checkboxB, если флажок checkboxA не установлен? Из того, что я пробовал, я могу установить значение checkboxB = false, когда checkboxA = false, но это изменение не отражается в пользовательском интерфейсе.
Моя таблица с флажками -
public void buildTable() {
myDataProvider.addDataDisplay(myTable);
// other columns
Column<Note, Boolean> checkboxA = new Column<Note, Boolean>(new CheckboxCell()){
@Override
public Boolean getValue(Note object) {
return object.isAChecked();
}
};
checkboxA.setFieldUpdater(new FieldUpdater<Note, Boolean>() {
@Override
public void update(int index, Note object, Boolean value) {
performCheckboxAOperation(object, value);
}
});
Column<Note, Boolean> checkboxB = new Column<Note, Boolean>(new CheckboxCell()){
@Override
public Boolean getValue(Note object) {
return object.isBChecked();
}
};
checkboxB.setFieldUpdater(new FieldUpdater<Note, Boolean>() {
@Override
public void update(int index, Note object, Boolean value) {
performCheckboxBOperation(object, value);
}
});
myTable.addColumn(checkboxA, "BOX A");
myTable.addColumn(checkboxB, "BOX B");
}
Метод для сохранения значения флажка A в БД, и если checkboxA == false, также установить checkboxB = false в БД -
public void performCheckboxAOperation(Note note, Boolean bool) {
this.presenter.performBoxOperation(note, bool, new AsyncCallback<CNote>() {
@Override
public void onFailure(Throwable caught) {
// error logic
}
@Override
public void onSuccess(CompanyNote result) {
cleanupDataProvider.flush();
if (result.isAChecked() == false) {
if (result.isBChecked() == true) {
unsetB(result);
}
}
}
});
}
Это мой способ снять флажок checkboxB, который изменяет значение в БД, но не в пользовательском интерфейсе -
private void unsetB(Note note) {
this.presenter.performBoxOperation(note, false, new AsyncCallback<Note>() {
@Override
public void onFailure(Throwable caught) {
// error logic
}
@Override
public void onSuccess(Note result) {
myDataProvider.flush();
myTable.redraw();
}
});
}
Насколько я понимаю, ListDataProvider необходимо очистить, чтобы изменения отразились в пользовательском интерфейсе. Это очень хорошо сработало для всех других полей в таблице, но не работает с CheckboxCells.
Я уже пробовал redraw() таблицу, как видно выше, но безуспешно.
Итак, что мне делать, чтобы вызвать изменение пользовательского интерфейса в другом CheckboxCell при нажатии на одну CheckboxCell?




Я думаю, что вы забыли на самом деле изменить значение объекта.
private void unsetB(final Note note) {
this.presenter.performBoxOperation(note, false, new AsyncCallback<Note>() {
// ...
@Override
public void onSuccess(Note result) {
note.setB(false); // set B value or copy `result` to `note`
// (`note` must be final)
myDataProvider.flush();
myTable.redraw();
}
});
}
Также в performCheckboxAOperation вы вызываете unsetB(result); - он должен быть unsetB(note);
Вы должны понимать, что в onSuccess вы получаете копию Note. Объект result отсутствует в DataProvider, note есть. И вы должны изменить значение note.
Всякий раз, когда вы отправляете объект на / с сервера, он сериализуется и десериализуется, что просто означает, что вы создаете копировать этого объекта. Итак, вы берете объект, делаете копию и обновляете копию,
Спасибо за это. Ваш ответ и комментарий помогли мне решить проблему. Мне пришлось заменить 'note в myDataProvider на result, а затем flush(), чтобы изменения отразились. Итак, myDataProvider.getList().set(myDataProvider.getList().indexOf(note), result); myDataProvider.flush();.
Я меняю стоимость объекта. Как указано выше,
this.presenter.performBoxOperation(note, false, new AsyncCallback<Note>()устанавливает значение объекта наfalseна сервере, сохраняет его в базе данных, а затем возвращаетNoteс изменением. Когда я просматриваюmyDataProviderвнутриonSuccess(), я вижу этотcheckboxB = false. Таким образом, значение изменяется, но не отражается в пользовательском интерфейсе при снятии флажка, даже после очистки поставщика данных и перерисовки таблицы. Я попытался сделатьnoteокончательным и вызвать вunsetB(note), что, как ни странно, сработало один раз, а потом больше никогда.