Browse Source

REPORT-146163 fix:调整下refreshComboBoxModel方法

fbp/feature
Richard.Fang 3 months ago
parent
commit
6350f426a5
  1. 40
      designer-base/src/main/java/com/fr/design/data/datapane/TableDataComboBox.java

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

@ -133,17 +133,8 @@ public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceC
/**
* 刷新数据源并更新下拉框的模型和选中项
* <p>
* - 更新下拉框模型时会暂时记录当前选中项并在刷新后恢复选中项
* - 通过标记 `refreshModel`避免刷新模型时触发不必要的选中事件
* <p>
* 关于 `refreshModel` 的作用
* 1. **抑制事件触发**下拉框模型在调用 `addElement` 方法时会触发 `fireItemStateChanged` 事件
* 2. **处理异步和顺序问题**由于取数的异步执行会导致回调后的UI操作与 `populateBean` 方法调用顺序出现交错
* 例如先执行 `refresh` 的取数操作然后调用 `populateBean`最后刷新模型
* 确保刷新模型但不触发选中事件以避免引发不必要的逻辑干扰
*
* @param source 数据源用于刷新model
* @param source 数据源用于刷新模型
*/
public void refresh(TableDataSource source) {
UIUtil.executeAsyncTaskAndUpdateUI(
@ -152,18 +143,31 @@ public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceC
setDsMap();
return null;
},
result -> {
result -> refreshComboBoxModel()
);
}
/**
* 刷新下拉框模型同时保留当前选中的数据项
* <p>
* 1. 获取下拉框中当前选中的数据项
* 2. 刷新下拉框的模型清空并重新填充数据此操作会重置选中的数据项
* 3. 在刷新模型后恢复之前选中的数据项
* <p>
* 关于 `refreshModel` 的作用
* 1. **抑制事件触发**下拉框模型在调用 `addElement` 方法时会触发 `fireItemStateChanged` 事件
* 通过标记 `refreshModel`可以在刷新过程中抑制此事件
* 2. **处理异步和顺序问题**由于取数操作是异步的可能会导致回调后的 UI 操作与其他逻辑 `populateBean`的调用顺序交错
* 标记 `refreshModel` 可确保在刷新模型时不触发选中事件从而避免逻辑干扰
* 3. **逻辑清晰性**刷新模型本质上是更新数据源的操作不应触发与用户交互相关的选中事件避免对上层逻辑造成额外负担
*/
private void refreshComboBoxModel() {
refreshModel = true;
// 获取当前选中的数据项
TableDataWrapper selectedItem = getSelectedItem();
// 刷新model,本次操作会重置选中的数据项
refreshComboBoxModel();
// 刷新model后恢复选中的数据项
refreshModel();
updateSelectedItem(selectedItem);
refreshModel = false;
}
);
}
protected void setResMap(TableDataSource source) {
this.resMap = DesignTableDataManager.getAllEditingDataSet(source);
@ -173,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