GWT - 如何在选中另一个CheckboxCell时以编程方式取消选中CheckboxCell?

时间:2018-05-29 23:12:58

标签: java user-interface checkbox gwt celltable

鉴于两个CheckboxCell checkboxA checkboxB ,如果取消选中checkboxA,如何以编程方式取消选中checkboxB?根据我的尝试,我可以在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");
}

在DB中存储复选框A值的方法,如果checkboxA == false,还在DB中设置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的方法,它会更改数据库中的值而不是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中反映更改。这对表中的所有其他字段都有效,但它不适用于CheckboxCell。

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

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

1 个答案:

答案 0 :(得分: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对象不在DataProvidernote中。你应该改变note的价值。