@ -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 refreshComboBox Model ( ) {
private void refreshModel ( ) {
//创建ComboBox模型并设置
DefaultComboBoxModel model = new DefaultComboBoxModel ( ) ;
this . setModel ( model ) ;