GWT - 如何在选中另一个 CheckboxCell 时以编程方式取消选中 CheckboxCell?
GWT - How to programmatically uncheck a CheckboxCell when another CheckboxCell is checked?
给定两个 CheckboxCell
的 checkboxA 和 checkboxB,如果未选中 checkboxA,我如何以编程方式取消选中 checkboxB?根据我的尝试,我可以在 checkboxA = false
时设置 checkboxB = false
的值,但此更改未反映在 UI.
中
我的 table 带有复选框 -
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 的方法,它会更改数据库中的值但不会更改 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 中。这对 table 中的所有其他字段都非常有效,但不适用于 CheckboxCells。
我已经尝试 redraw()
table 如上所示,但没有任何运气。
那么,当单击一个 CheckboxCell 时,我应该怎么做才能触发另一个 CheckboxCell 中的 UI 更改?
我认为您忘记了实际更改对象的值。
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
的值。
给定两个 CheckboxCell
的 checkboxA 和 checkboxB,如果未选中 checkboxA,我如何以编程方式取消选中 checkboxB?根据我的尝试,我可以在 checkboxA = false
时设置 checkboxB = false
的值,但此更改未反映在 UI.
我的 table 带有复选框 -
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 的方法,它会更改数据库中的值但不会更改 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 中。这对 table 中的所有其他字段都非常有效,但不适用于 CheckboxCells。
我已经尝试 redraw()
table 如上所示,但没有任何运气。
那么,当单击一个 CheckboxCell 时,我应该怎么做才能触发另一个 CheckboxCell 中的 UI 更改?
我认为您忘记了实际更改对象的值。
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
的值。