【问题标题】:GWT - How to programmatically uncheck a CheckboxCell when another CheckboxCell is checked?GWT - 当另一个 CheckboxCell 被选中时,如何以编程方式取消选中一个 CheckboxCell?
【发布时间】:2018-11-08 16:37:48
【问题描述】:

给定两个 CheckboxCellcheckboxAcheckboxB,如果未选中 checkboxA,我如何以编程方式取消选中 checkboxB?根据我的尝试,当checkboxA = false 时,我可以设置checkboxB = false 的值,但此更改并未反映在UI 中。

我的带有复选框的表格 -

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的值存储在DB中的方法,如果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 的方法,它改变了 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 更改?

【问题讨论】:

    标签: java user-interface checkbox gwt celltable


    【解决方案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&lt;Note&gt;(),在服务器上将对象的值设置为false,将其存储在数据库中,然后将更改返回Note。当我在onSuccess() 中逐步通过myDataProvider 时,我可以看到checkboxB = false。因此,即使在刷新数据提供程序并重绘表格之后,取消选中该复选框也会更改值,但不会反映在 UI 中。我尝试将note 设为final 并调用unsetB(note),这很奇怪,它曾经工作过一次,然后再也没有。
    • 每当您向/从服务器发送一个对象时,它都会被序列化和反序列化,这仅仅意味着您制作了该对象的副本。所以你拿一个对象,制作一个副本并更新一个副本,
    • 谢谢。您的回答和评论帮助我调试了这个问题。我必须用result 替换myDataProvider 中的'note,然后用flush() 替换以使更改得到反映。所以,myDataProvider.getList().set(myDataProvider.getList().indexOf(note), result); myDataProvider.flush();.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2018-12-18
    • 2012-07-24
    相关资源
    最近更新 更多