首页 > 解决方案 > GWT - 当另一个 CheckboxCell 被选中时,如何以编程方式取消选中一个 CheckboxCell?

问题描述

给定两个checkboxAcheckboxB,如果未选中 checkboxA ,我如何以编程方式取消选中 checkboxB CheckboxCell?根据我的尝试,我可以设置when的值,但此更改并未反映在 UI 中。checkboxB = falsecheckboxA = 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 的方法,它正在更改 DB 中的值,而不是 UI 中的值 -

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才能使更改反映在 UI 中。这对表中的所有其他字段都非常有效,但不适用于 CheckboxCells。

redraw()如上所示,我已经尝试过桌子,但没有任何运气。

那么,当单击一个 CheckboxCell 时,我应该怎么做才能触发另一个 CheckboxCell 中的 UI 更改?

标签: javauser-interfacecheckboxgwtcelltable

解决方案


I think that you forgot to actually change the object's value.

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

Also, in performCheckboxAOperation you call unsetB(result); - it should be unsetB(note);

You need to understand that in onSuccess you get a copy of Note. The result object is not in the DataProvider, note is. And you should change note's value.


推荐阅读