gpt4 book ai didi

javafx - 将可观察属性绑定(bind)到集合函数?

转载 作者:行者123 更新时间:2023-12-02 13:15:13 25 4
gpt4 key购买 nike

我有课Market其中包含 MarketUpdate 的集合名为 m_updates 的对象.对于 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_timeMarketUpdate 拥有的 SimpleLongProperty目的。当一个 Market对象已更新,新的 MarketUpdate对象被添加到 m_updates 的末尾收藏。这意味着绑定(bind)需要自动从一个对象转换到另一个对象,并且需要通知 tableview 并更新自身以反射(reflect)新对象中的数据。我认为通过 first() 进行绑定(bind)和 last()上述集合的函数以非常简单的方式捕捉了这个想法,但它不会编译。

有许多属性,如 m_strikesm_time .我怎样才能优雅地做到这一点?

最佳答案

如果我了解您的用例,您要做的是创建一个可观察值,该值表示给定 Market 中第一次和最后一次更新的时间属性目的。为此,您可以创建 objectBinding基于updates列出每个 Market 的内部对象,然后提取 first()last()元素的timeProperty .在以下示例中,只要您在任何 Market 中增加更新列表,TableView 就会更新。目的。

请记住,该示例需要每个 Market至少有一个更新。如果这不是您的情况,请确保相应地处理 null 。

class Market {
val updates = FXCollections.observableArrayList<MarketUpdate>()
}

class MarketUpdate {
val timeProperty = SimpleObjectProperty(LocalDateTime.now())
}

class MarketList : View("Markets") {
val markets = FXCollections.observableArrayList<Market>()
val data = SortedFilteredList<Market>(markets)

override val root = borderpane {
prefWidth = 500.0

center {
tableview(markets) {
column<Market, LocalDateTime>("Created at", { objectBinding(it.value.updates) { first() }.select { it!!.timeProperty } })
column<Market, LocalDateTime>("Last update", { objectBinding(it.value.updates) { last() }.select { it!!.timeProperty } })
}
}
bottom {
toolbar {
// Click to add an update to the first entry
button("Add update").action {
markets.first().updates.add(MarketUpdate())
}
}
}
}

init {
// Add some test entries
markets.addAll(
Market().apply { updates.addAll(MarketUpdate(), MarketUpdate(), MarketUpdate()) },
Market().apply { updates.addAll(MarketUpdate(), MarketUpdate(), MarketUpdate()) },
Market().apply { updates.addAll(MarketUpdate(), MarketUpdate(), MarketUpdate()) },
Market().apply { updates.addAll(MarketUpdate(), MarketUpdate(), MarketUpdate()) }
)
}
}

我使用了 SortedFilteredList 来更轻松地处理排序。排序在这里起作用的原因是列实际上由 LocalDateTime 值表示。

Resulting UI

我希望这能给你一些想法:)

关于javafx - 将可观察属性绑定(bind)到集合函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45974302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com