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 🙂

  • Usar bibliotecas de UI de terceros con TornadoFX
  • Cómo configurar una aplicación Gluon con Kotlin y Tornado FX
  • ¿Cómo puedo refactorizar una vista para permitir el filtrado de elementos vinculados a un observable ArrayList dentro de una aplicación tornadofx?
  • ¿Cómo llenar el ancho de la tabla disponible con columnas?
  • La compilation de Gradle no puede encontrar tornadofx en Linux
  • TornadoFX: permite copyr un elemento de una vista de list al portapapeles
  • ¿Cómo agregar leyenda secundaria al gráfico JavaFX?
  • Lanzar una aplicación TornadoFX desde (un progtwig existente) de Kotlin
  • Crea una vista arbitraria
  • TornadoFX: Type-Safe CSS con otras bibliotecas
  • ¿Por qué mi escena es nula?