From 6350f426a5fdefd57f8d65c336ff8e05a49d9cb8 Mon Sep 17 00:00:00 2001 From: "Richard.Fang" Date: Tue, 14 Jan 2025 10:03:30 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-146163=20fix:=E8=B0=83=E6=95=B4=E4=B8=8B?= =?UTF-8?q?refreshComboBoxModel=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/TableDataComboBox.java | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataComboBox.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataComboBox.java index 129851d8ed..692f940d69 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataComboBox.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataComboBox.java @@ -133,17 +133,8 @@ public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceC /** * 刷新数据源并更新下拉框的模型和选中项 - *

- * - 更新下拉框模型时,会暂时记录当前选中项,并在刷新后恢复选中项 - * - 通过标记 `refreshModel`,避免刷新模型时触发不必要的选中事件 - *

- * 关于 `refreshModel` 的作用: - * 1. **抑制事件触发**:下拉框模型在调用 `addElement` 方法时会触发 `fireItemStateChanged` 事件, - * 2. **处理异步和顺序问题**:由于取数的异步执行会导致回调后的UI操作与 `populateBean` 方法调用顺序出现交错 - * (例如:先执行 `refresh` 的取数操作,然后调用 `populateBean`,最后刷新模型) - * 确保刷新模型但不触发选中事件,以避免引发不必要的逻辑干扰 * - * @param source 数据源,用于刷新model + * @param source 数据源,用于刷新模型 */ public void refresh(TableDataSource source) { UIUtil.executeAsyncTaskAndUpdateUI( @@ -152,19 +143,32 @@ public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceC setDsMap(); return null; }, - result -> { - refreshModel = true; - // 获取当前选中的数据项 - TableDataWrapper selectedItem = getSelectedItem(); - // 刷新model,本次操作会重置选中的数据项 - refreshComboBoxModel(); - // 刷新model后恢复选中的数据项 - updateSelectedItem(selectedItem); - refreshModel = false; - } + result -> refreshComboBoxModel() ); } + /** + * 刷新下拉框模型,同时保留当前选中的数据项 + *

+ * 1. 获取下拉框中当前选中的数据项 + * 2. 刷新下拉框的模型(清空并重新填充数据),此操作会重置选中的数据项 + * 3. 在刷新模型后,恢复之前选中的数据项 + *

+ * 关于 `refreshModel` 的作用: + * 1. **抑制事件触发**:下拉框模型在调用 `addElement` 方法时会触发 `fireItemStateChanged` 事件, + * 通过标记 `refreshModel`,可以在刷新过程中抑制此事件 + * 2. **处理异步和顺序问题**:由于取数操作是异步的,可能会导致回调后的 UI 操作与其他逻辑(如 `populateBean`)的调用顺序交错。 + * 标记 `refreshModel` 可确保在刷新模型时,不触发选中事件,从而避免逻辑干扰 + * 3. **逻辑清晰性**:刷新模型本质上是更新数据源的操作,不应触发与用户交互相关的选中事件,避免对上层逻辑造成额外负担 + */ + private void refreshComboBoxModel() { + refreshModel = true; + TableDataWrapper selectedItem = getSelectedItem(); + 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);