JavaFX嵌套Observable对象变更同步到上层ObservableList及强制刷新方法
方案可行性说明
你的修改思路方向正确,但需要补充两个关键配置才能实现完整的变更通知链路:
SomeItem的属性修改为ObservablePropertyBase<Item>后,需要为每个属性实现标准的JavaFX可观察属性暴露方法:即对应getItem()、setItem(Item)、itemProperty()三个方法,才能正常抛出属性变更事件。Person中的列表改为可观察列表时,默认的ObservableList仅监听元素的增删改操作,不会监听元素内部的属性变更,你需要使用带提取器的可观察列表构造方法:
这样配置后,ObservableList<SomeItem> list = FXCollections.observableArrayList( someItem -> new Observable[]{someItem.itemProperty(), someItem.item2Property()} );SomeItem内部的属性变更会冒泡到所属的list对象,触发列表变更事件。- 额外注意:如果需要
personsList感知到Person内部list的变更,Person本身也需要实现可观察接口,将内部的list作为可观察属性暴露,否则list的变更不会向上传递到personsList。
手动强制刷新的实现方法
可以手动触发personsList的更新,常见有两种方案:
- 全量刷新:JavaFX 8u60及以上版本中,直接调用
personsList.refresh()即可,会强制触发列表的全局更新通知,所有绑定的UI控件会重新渲染全部元素。 - 局部刷新(性能更优):如果仅修改了某个索引位置的元素,可以用同元素替换的方式触发单条更新:
不需要刷新全量列表,性能更好。int modifiedIndex = 要刷新的元素下标; personsList.set(modifiedIndex, personsList.get(modifiedIndex));
内容的提问来源于stack exchange,提问作者hkcode
相关产品推荐
相关产品推荐

