Kotlin和TornadoFX:将可观察的属性绑定到集合函数?

时间:2017-08-31 06:02:44

标签: javafx collections binding kotlin tornadofx

我有一个类 public void transformPage(View view, float position) { int pageWidth = view.getWidth(); if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. view.setAlpha(0); } else if (position <= 0) { // [-1,0] // Use the default slide transition when moving to the left page view.setAlpha(1); view.setTranslationX(view.getWidth() * -position); //set Y position to swipe in from top float yPosition = position * view.getHeight(); view.setTranslationY(yPosition); view.setScaleX(1); view.setScaleY(1); } else if (position <= 1) { // (0,1] // Fade the page out. view.setAlpha(1 - position); // Counteract the default slide transition view.setTranslationX(pageWidth * -position); // Scale the page down (between MIN_SCALE and 1) float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)); view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); } else { // (1,+Infinity] // This page is way off-screen to the right. view.setAlpha(0); } } ,其中包含一组名为Market的{​​{1}}个对象。对于UI,我使用类型安全的构建器在tableview中创建列,如下所示:

MarketUpdate

m_updates属性只是一个由override val root = tableview<Market> { val sortedMarketList = SortedList<Market>(markets) sortedMarketList.comparatorProperty().bind(this.comparatorProperty()) items = sortedMarketList ... column("Strikes", Market::m_strikes) ... 对象直接拥有的SimpleIntegerProperty。但是,我需要能够构建这样的列:

m_strikes

其中Market... column("Created At", Market::m_updates::first::m_time) ... ... column("Last Update", Market::m_updates::last::m_time) ... 对象拥有的SimpleLongProperty。更新m_time对象时,会在MarketUpdate集合的末尾添加新的Market对象。这意味着绑定需要自动从一个对象转换到另一个对象,并且需要通知tableview并更新自身以反映新对象中的数据。我认为通过上面描述的集合的MarketUpdatem_updates函数进行绑定会以一种非常简单的方式捕获这个想法,但它不会被编译。

有许多属性,例如first()last()。我怎样才能优雅地实现这一目标?

1 个答案:

答案 0 :(得分:2)

如果我理解您的用例,您要做的是创建一个可观察的值,该值表示给定Market对象中第一次和最后一次更新的时间属性。为此,您可以根据每个objectBinding对象内的updates列表创建Market,然后提取first()last()元素的{{1} }}。在以下示例中,只要在任何timeProperty对象中扩充更新列表,TableView就会更新。

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

Market

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

Resulting UI

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