¿Cómo puedo refactorizar una vista para permitir el filtrado de elementos vinculados a un observable ArrayList dentro de una aplicación tornadofx?

Empecé con el ejemplo gradle hello-world encontrado en https://github.com:JetBrains/kotlin-examples.git y lo modifiqué para usar TornadoFX.

Esta es una aplicación que muestra una list de elementos. Puede agregar a la list, y RequestView mostrará automáticamente todos los elementos.

Lo tengo funcionando para que los elementos almacenados estén vinculados a un TextView observableArrayList pero ahora quiero implementar un filter usando TextView en la parte inferior. Pero me cuesta entender si esto significa que debo crear una nueva list que se administre internamente en RequestView , y filtrar desde allí, o cómo hacerlo.

 package demo import javafx.collections.FXCollections import javafx.geometry.Pos import javafx.scene.control.TextField import javafx.scene.layout.VBox import javafx.scene.text.FontWeight import tornadofx.* class helloWorldApp : App(HelloWorld::class) { } class HelloWorld : View() { override val root = VBox() var requestView: RequestView by singleAssign() var filterField: TextField by singleAssign() init { with(root) { requestView = RequestView() this += requestView filterField = TextField() this += filterField } requestView.items.add("Hi there") requestView.items.add("Another one") } } class RequestView() : View() { var items = FXCollections.observableArrayList<String>() override val root = listview(items) { cellFormat { graphic = cache { form { fieldset { label(it) { alignment = Pos.CENTER_LEFT style { fontSize = 15.px fontWeight = FontWeight.BOLD } } } } } } } } 

Aquí está el file build.gradle, en caso de que sea útil.

 buildscript { ext.kotlin_version = '1.1.2' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'kotlin' apply plugin: 'application' mainClassName = 'demo.helloWorldApp' defaultTasks 'run' repositories { mavenCentral() } tasks.compileKotlin.kotlinOptions.jvmTarget = "1.8" dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" testCompile 'junit:junit:4.11' testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" compile 'no.tornado:tornadofx:1.7.10' } task wrapper(type: Wrapper) { gradleVersion = "2.7" } 

Debe usar SortedFiltenetworkingList que envuelve una SortedFiltenetworkingList observable y acepta un pnetworkingicado que se usa para discriminar las inputs.

Hay un acoplamiento desafortunado entre sus dos puntos de vista, por lo que debería considerar disparar un evento en su lugar, pero aquí hay una solución de trabajo con cambios mínimos en su ejemplo. singleAssign los datos a un model y limpié el código ui, y me deshice de las declaraciones de singleAssign y apliqué algunas mejores prácticas a los desarrolladores 🙂

Como puede ver, SortedFiltenetworkingList tiene un filterWhen que se filterWhen function cada vez que textProperty() del campo de text.

 class HelloWorldApp : App(HelloWorld::class) class HelloWorld : View() { val requestView: RequestView by inject() override val root = vbox { add(requestView) textfield { promptText = "Filter" requestView.data.filterWhen(textProperty()) { query, item -> item.contains(query, ignoreCase = true) } } } } class ItemsModel : ViewModel() { val items = FXCollections.observableArrayList<String>() fun addItem(item: String) = items.add(item) init { addItem("Hi there") addItem("Another one") } } class RequestView() : View() { val model: ItemsModel by inject() val data = SortedFiltenetworkingList(model.items) override val root = listview(data) { cellFormat { graphic = cache { form { fieldset { label(it) { alignment = Pos.CENTER_LEFT style { fontSize = 15.px fontWeight = FontWeight.BOLD } } } } } } } } 
  • TornadoFX: Type-Safe CSS con otras bibliotecas
  • Context de reinicio de JavaFX
  • Cómo ejecutar tornado fx hello world con java 7
  • La compilation de Gradle no puede encontrar tornadofx en Linux
  • TornadoFX: permite copyr un elemento de una vista de list al portapapeles
  • TornadoFX ItemViewModel se actualiza si se cambia el object de respaldo que no expone las properties de JavaFX
  • Cómo instalar un controller de clics en una vista de list dinámica (en tornadofx)
  • Lanzar una aplicación TornadoFX desde (un progtwig existente) de Kotlin
  • En TornadoFX, ¿cómo puedo vincular las properties de BigDecimal a otra propiedad de BigDecimal usando objectBinding?
  • Desplazamiento suave en JavaFX TableView
  • TornadoFx: que realiza mejor FXML o type-CSS