Kotlin y TornadoFX: ¿une una propiedad observable a una function de recostackción?

Tengo un Market class que contiene una colección de objects m_updates llamada m_updates . Para la interfaz de usuario, estoy usando constructores de tipo seguro para crear columnas en una vista de tabla como esta:

 override val root = tableview<Market> { val sortedMarketList = SortedList<Market>(markets) sortedMarketList.comparatorProperty().bind(this.comparatorProperty()) items = sortedMarketList ... column("Strikes", Market::m_strikes) ... 

La propiedad m_strikes es simplemente una Propiedad SimpleInteger propiedad directa de un object Market . Sin embargo, necesito poder build columnas como estas:

 ... column("Created At", Market::m_updates::first::m_time) ... ... column("Last Update", Market::m_updates::last::m_time) ... 

donde m_time es SimpleLongProperty propiedad de un object MarketUpdate . Cuando se actualiza un object MarketUpdate se agrega un nuevo object MarketUpdate al final de la colección m_updates . Esto significa que la vinculación necesita pasar automáticamente de un object a otro, y que la vista de tabla debe notificarse y actualizarse para reflejar los datos en el nuevo object. Creo que el enlace por medio de la first() y la last() funciones de la colección como se describió anteriormente capta la idea de una manera muy simple, pero no se comstackrá.

Hay muchas properties como m_strikes y m_time . ¿Cómo puedo lograr esto con gracia?

Si entiendo su caso de uso, lo que desea hacer es crear un valor observable que represente la propiedad de time para la primera y la última actualización en un object de Market determinado. Para hacer eso, puede crear un objectBinding basado en la list de updates dentro de cada object Market , luego extraer el timeProperty del first() o last() elemento. En el siguiente ejemplo, TableView se actualizará tan pronto como aumente la list de actualizaciones en cualquier object Market .

Tenga en count que el ejemplo requiere que cada Market tenga al less una actualización. Si este no es su caso, asegúrese de manejar nulo en consecuencia.

 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 = SortedFiltenetworkingList<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()) } ) } } 

He usado una SortedFiltenetworkingList para que sea más fácil lidiar con la sorting. El tipo de razón funciona aquí, es que las columnas están realmente representadas por valores de LocalDateTime.

IU resultante

Espero que esto te de algunas ideas 🙂

  • TornadoFx: que realiza mejor FXML o type-CSS
  • ¿Cómo agregar leyenda secundaria al gráfico JavaFX?
  • ¿Cómo puedo crear un encabezado de columna nested / dividido usando TornadoFx?
  • Context de reinicio de JavaFX
  • El text de la label no se actualiza aunque el hilo de la interfaz de usuario parece responder
  • ¿Cuál es la mejor práctica para crear un componente de IU personalizado en tornadofx?
  • Cómo configurar una aplicación Gluon con Kotlin y Tornado FX
  • Forma de configurar las properties de PrimaryStage o Scene en TornadoFX
  • Cómo implementar TornadoFX WebEngine Callback en Kotlin
  • TornadoFX ¿Cómo crear MDI con una list de models de windows hijas?
  • Cómo ejecutar tornado fx hello world con java 7