Kotlin开发中如何更新TornadoFX框架的ComboBox组件
问题原因
你当前绑定到ComboBox的可观察列表和你修改JSON后的数据集没有联动,核心问题有两个:
- 若你修改数据后仅更新了JSON文件,没有同步更新已经绑定到UI的
printerData/materialData实例,UI无法感知数据变化 - 如果你修改数据后重新调用
findAllObservable()生成了新的列表,直接给printerData/materialData变量赋值的话,只会改变变量指向的实例,而ComboBox绑定的还是旧的列表实例,自然不会刷新
解决方案
1. 修正可观察列表定义
把列表变量从var改为val,避免意外重新赋值变量导致绑定失效,多余的.observable()可以根据findAllObservable()的返回值决定是否保留:
val selectedPrinter = model.bind { SimpleObjectProperty<PrinterModel>() } val selectedMaterial = model.bind { SimpleObjectProperty<MaterialModel>() } val printers = PrinterJSONStore() // 如果findAllObservable本身返回ObservableList,直接赋值即可 val printerData = printers.findAllObservable() // 如果findAllObservable返回普通List,保留observable()转换即可 // val printerData = printers.findAllObservable().observable() val materials = MaterialJSONStore() val materialData = materials.findAllObservable() // val materialData = materials.findAllObservable().observable() override val root = form { setPrefSize(400.0, 600.0) fieldset(labelPosition = Orientation.VERTICAL) { text("") combobox(selectedMaterial,materialData) { makeAutocompletable() } text("") combobox(selectedPrinter, printerData) } }
2. 增删操作同步更新可观察列表
所有新增、删除操作,修改完JSON文件后,同步操作绑定UI的同一个可观察列表实例:
新增示例
// 新增打印机逻辑 fun addNewPrinter(printer: PrinterModel) { // 写入JSON文件 printers.save(printer) // 同步更新绑定UI的可观察列表,会自动触发ComboBox刷新 printerData.add(printer) }
删除示例
// 删除选中打印机逻辑 fun deleteSelectedPrinter() { selectedPrinter.get()?.let { target -> // 从JSON文件删除 printers.delete(target) // 同步更新可观察列表,自动刷新UI printerData.remove(target) } }
3. 全量刷新列表的替代方案
如果你的数据修改逻辑是全量重读JSON文件,不要直接给列表变量重新赋值,调用setAll方法替换现有列表的全部内容即可:
// 数据修改后重读JSON全量刷新列表 fun refreshAllData() { printerData.setAll(printers.findAllObservable()) materialData.setAll(materials.findAllObservable()) }
内容的提问来源于stack exchange,提问作者MrSpeedy
相关产品推荐
相关产品推荐

