Browse Source

Pull request #16191: REPORT-146163 fix:comboBox的refresh流程中非UI操作后台执行

Merge in DESIGN/design from ~RICHARD.FANG/design:fbp/feature to fbp/feature

* commit '6350f426a5fdefd57f8d65c336ff8e05a49d9cb8':
  REPORT-146163 fix:调整下refreshComboBoxModel方法
  REPORT-146163 fix:comboBox的refresh流程中非UI操作后台执行
fbp/feature
Richard.Fang-方超 2 months ago
parent
commit
a411894328
  1. 44
      designer-base/src/main/java/com/fr/design/data/datapane/TableDataComboBox.java

44
designer-base/src/main/java/com/fr/design/data/datapane/TableDataComboBox.java

@ -117,7 +117,7 @@ public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceC
@Override
public void ancestorAdded(AncestorEvent event) {
registerDSChangeListener();
UIUtil.invokeLaterIfNeeded(() -> refresh(DesignTableDataManager.getEditingTableDataSource()));
refresh(DesignTableDataManager.getEditingTableDataSource());
}
@Override
@ -132,20 +132,40 @@ public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceC
}
/**
* refresh ComboBox
* 刷新数据源并更新下拉框的模型和选中项
*
* @param source 数据源
* @param source 数据源用于刷新模型
*/
public void refresh(TableDataSource source) {
UIUtil.executeAsyncTaskAndUpdateUI(
() -> {
setResMap(source);
setDsMap();
return null;
},
result -> refreshComboBoxModel()
);
}
/**
* 刷新下拉框模型同时保留当前选中的数据项
* <p>
* 1. 获取下拉框中当前选中的数据项
* 2. 刷新下拉框的模型清空并重新填充数据此操作会重置选中的数据项
* 3. 在刷新模型后恢复之前选中的数据项
* <p>
* 关于 `refreshModel` 的作用
* 1. **抑制事件触发**下拉框模型在调用 `addElement` 方法时会触发 `fireItemStateChanged` 事件
* 通过标记 `refreshModel`可以在刷新过程中抑制此事件
* 2. **处理异步和顺序问题**由于取数操作是异步的可能会导致回调后的 UI 操作与其他逻辑 `populateBean`的调用顺序交错
* 标记 `refreshModel` 可确保在刷新模型时不触发选中事件从而避免逻辑干扰
* 3. **逻辑清晰性**刷新模型本质上是更新数据源的操作不应触发与用户交互相关的选中事件避免对上层逻辑造成额外负担
*/
private void refreshComboBoxModel() {
refreshModel = true;
setResMap(source);
setDsMap();
// 获取当前选中的数据项
TableDataWrapper dataWrapper = getSelectedItem();
// 更新下拉模型
refreshComboBoxModel();
//处理已选中的数据项
updateSelectedItem(dataWrapper);
TableDataWrapper selectedItem = getSelectedItem();
refreshModel();
updateSelectedItem(selectedItem);
refreshModel = false;
}
@ -157,7 +177,7 @@ public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceC
dsMap = DesignTableDataManager.getAllDataSetIncludingProcedure(resMap);
}
private void refreshComboBoxModel() {
private void refreshModel() {
//创建ComboBox模型并设置
DefaultComboBoxModel model = new DefaultComboBoxModel();
this.setModel(model);

Loading…
Cancel
Save