1, 最简单粗暴,但也最不合理的做法
在数据对象更新后,调用 table.refresh() 方法。
这样做,表格实际上是刷新了,因为绑定的list里的对象确实发生了变化。
* 但是,这样并不符合数据绑定的工作方式,实际上调用refresh()的结果是重新渲染表格,可理解为表格初始化为空白后,重新加载了,当然实际fx不是这么做,但refresh()意味着实际是UI层重新初始化。
* 并不是数据绑定的监听起了作用。原因(痛点):table 绑定 list ,Oracle 只实现了增加、删除2个动作的监听,即是说,list 中单个元素本身属性值的修改,并不会被数据绑定所监听。
因为以上原因,出现的现象就是:
当 list 中元素有增、删时候, table 能够实时刷新。
当 list 中元素属性变化时候, table 不能实时刷新。(因为此时修改事件并不受监听,list 不认为自己有变化,随之 table 也就不会刷新)。
—- 第1种情况,致使 list 监听不到变化的前提是,修改的属性为JavaBean普通属性类型(如String,Integer) ,对 table cell 定义如:
tc_status.setCellValueFactory(new PropertyValueFactory<Account,String>("status"));
2,因为JavaBean普通属性,即使通过
new PropertyValueFactory<Account,String>("name")
这样的包装,变成可以在 table 中显示,但实际上偏离了 JavaFx 的设计初衷。
与 JavaFx UI 层进行交互的类属性,应当定义为对应的 xxxProperty 包装类 (如 StringProperty , IntegerProperty 等 )。
然后,在对 table cellValueFactory 定义时,就可以直接返回 xxxProperty 对象 (因为 StringProperty 本身就是 ObservableValue 的子类)
代码实例: