GWT - Как программно снять отметку с CheckboxCell, когда отмечен другой CheckboxCell?

Учитывая два 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?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
259
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что вы забыли на самом деле изменить значение объекта.

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.

Я меняю стоимость объекта. Как указано выше, this.presenter.performBoxOperation(note, false, new AsyncCallback<Note>() устанавливает значение объекта на false на сервере, сохраняет его в базе данных, а затем возвращает Note с изменением. Когда я просматриваю myDataProvider внутри onSuccess(), я вижу этот checkboxB = false. Таким образом, значение изменяется, но не отражается в пользовательском интерфейсе при снятии флажка, даже после очистки поставщика данных и перерисовки таблицы. Я попытался сделать note окончательным и вызвать в unsetB(note), что, как ни странно, сработало один раз, а потом больше никогда.

Anish Sana 30.05.2018 17:53

Всякий раз, когда вы отправляете объект на / с сервера, он сериализуется и десериализуется, что просто означает, что вы создаете копировать этого объекта. Итак, вы берете объект, делаете копию и обновляете копию,

Adam 30.05.2018 18:13

Спасибо за это. Ваш ответ и комментарий помогли мне решить проблему. Мне пришлось заменить 'note в myDataProvider на result, а затем flush(), чтобы изменения отразились. Итак, myDataProvider.getList().set(myDataProvider.getList().indexO‌​f(note), result); myDataProvider.flush();.

Anish Sana 30.05.2018 18:46

Другие вопросы по теме