Cómo instalar un controller de clics en una vista de list dinámica (en tornadofx)

Mi aplicación necesita permitir adiciones a la list. He descubierto cómo puedo agregar dinámicamente a una vista de list usando observableArrayList . Si hago clic en el button, se agrega un elemento a la list y se muestra.

Ahora estoy luchando por agregar un manejador de clics (quiero manejar el evento que ocurre cuando alguien hace clic en cualquier elemento dentro de la vista de list). ¿Dónde hago esto?

Aquí está mi código.

 package someapp import javafx.collections.FXCollections import javafx.geometry.Pos import javafx.scene.layout.VBox import javafx.scene.text.FontWeight import tornadofx.* class MyApp : App(HelloWorld::class) { } class HelloWorld : View() { val leftSide: LeftSide by inject() override val root = borderpane { left = leftSide.root } } class LeftSide: View() { var requestView: RequestView by singleAssign() override val root = VBox() init { with(root) { requestView = RequestView() this += requestView this += button("Add Item") { action { requestView.responses.add( Request( "example.com", "/foo/bar", "{ \"foo\" : \"bar\"}".toByteArray())) } } } } } class RequestView : View() { val responses = FXCollections.observableArrayList<Request>( ) override val root = listview(responses) { cellFormat { graphic = cache { form { fieldset { label(it.hostname) { alignment = Pos.CENTER_RIGHT style { fontSize = 22.px fontWeight = FontWeight.BOLD } } field("Path") { label(it.path) } } } } } } } class Request(val hostname: String, val path: String, val body: ByteArray) { } 

Para configurar una callback cuando se selecciona un elemento en un ListView, use la onUserSelect llamada onUserSelect :

 onUserSelect { information("You selected $it") } 

Opcionalmente, puede pasar cuántos clics constituye una selección también, el valor pnetworkingeterminado es 2:

 onUserSelect(1) { information("You selected $it") } 

Está utilizando algunas construcciones obsoletas en su código, aquí hay una versión actualizada convertida a las mejores prácticas 🙂

 class MyApp : App(HelloWorld::class) class HelloWorld : View() { override val root = borderpane { left(LeftSide::class) } } class LeftSide : View() { val requestView: RequestView by inject() override val root = vbox { add(requestView) button("Add Item").action { requestView.responses.add(Request("example.com", "/foo/bar", """{ "foo" : "bar"}""".toByteArray())) } } } class RequestView : View() { val responses = FXCollections.observableArrayList<Request>() override val root = listview(responses) { cellFormat { graphic = cache { form { fieldset { label(it.hostname) { alignment = Pos.CENTER_RIGHT style { fontSize = 22.px fontWeight = FontWeight.BOLD } } field("Path") { label(it.path) } } } } } onUserSelect(1) { information("You selected $it") } } } class Request(val hostname: String, val path: String, val body: ByteArray) 
  • preguntas sobre DI, ViewModel, etc.
  • TornadoFX JavaFX Sync Desplazarse por las vistas de tabla
  • TornadoFX cómo agregar validation al editar TableView
  • En TornadoFX, ¿cómo puedo hacer que una propiedad cambie cuando cambian otras properties?
  • Animación consecutiva en TornadoFX?
  • No se puede hacer que el nodo se centre en un StackPane con TornadoFX
  • Enlazando una vista a una propiedad de controller cambiante
  • java.lang.ClassNotFoundException: no encontró la class "com.my.app.example.Main" en la ruta: DexPathList
  • TornadoFx: que realiza mejor FXML o type-CSS
  • CellCache se representa inesperadamente en TableView con tornadoFX
  • Dibujando líneas desde ViewModel TornadoFX