【发布时间】:2020-01-06 03:51:26
【问题描述】:
我有一个类Market,其中包含一个名为m_updates 的MarketUpdate 对象集合。对于 UI,我使用类型安全构建器在 tableview 中创建列,如下所示:
override val root = tableview<Market> {
val sortedMarketList = SortedList<Market>(markets)
sortedMarketList.comparatorProperty().bind(this.comparatorProperty())
items = sortedMarketList
...
column("Strikes", Market::m_strikes)
...
m_strikes 属性只是 Market 对象直接拥有的 SimpleIntegerProperty。但是,我需要能够构建这样的列:
...
column("Created At", Market::m_updates::first::m_time)
...
...
column("Last Update", Market::m_updates::last::m_time)
...
其中m_time 是MarketUpdate 对象拥有的SimpleLongProperty。当Market 对象更新时,一个新的MarketUpdate 对象将添加到m_updates 集合的末尾。这意味着绑定需要自动从一个对象转换到另一个对象,并且需要通知 tableview 并更新自身以反映新对象中的数据。我认为通过上述集合的first() 和last() 函数进行绑定以非常简单的方式捕获了这个想法,但它不会编译。
有很多属性,例如m_strikes 和m_time。我怎样才能优雅地做到这一点?
【问题讨论】:
-
我想我现在正在使用 SimpleObjectProperty 和一个虚拟对象做一些事情,但我不相信一旦进行了所有必要的调整后它会正常工作。一旦我能够测试它,我会发表另一条评论。
-
我尝试的解决方案是将
val m_first = SimpleObjectProperty<MarketUpdate>(dummyMarketUpdate)添加到市场对象,在适当的时候更新它,然后将列行更改为column("Created At", Market::m_first::get)。这需要按照text = it.m_time.get().toString()的行设置文本,但这没什么大不了的。不幸的是,此解决方案会阻止表格的排序功能正常工作。它可能会尝试根据 m_first.get() 返回的内容而不是单元格中显示的文本进行排序。 -
Comparator lambda 可能已经解决了排序问题。需要确保对实时数据进行正确排序。
标签: javafx collections binding kotlin tornadofx