Considere el ejemplo siguiente, que tiene como objetivo (Kotlin / tornadofx) para conectar el contenido de un campo de texto con el texto de una etiqueta a través de la unión. La etiqueta debe reflejar un valor derivado del campo de texto, en este caso el hash. ¿Cómo puedo lograr esto adecuadamente vinculante (Siento que el uso de un changelistener no es la forma correcta de ir).
class HashView : View("My View") {
val hashProperty = SimpleStringProperty("EMPTY")
override val root = vbox {
textfield {
hashProperty.bind(stringBinding(text) { computeHash(text)}) // This does not work
}
label(hashProperty)
}
}
PD: respuestas en java / JavaFX también son bienvenidos siempre que de alguna manera me puedo aplicar la idea en tornadofx también.
ACTUALIZACIÓN 1 : He descubierto que no era más que un pequeño cambio necesario para hacer mi ejemplo de trabajo, es decir, que debe ser
hashProperty.bind(stringBinding(textProperty() { computeHash(this.value) })
No soy sin embargo, todavía con certeza si esta es la forma convencional de hacerlo. Así que voy a dejar esta cuestión abierta.
Recomiendo no involucrar a las propiedades de los elementos de entrada reales en los cálculos. Debe definir la propiedad de entrada primero y se unen a que el campo de texto. A continuación, crear un derivado StringBinding
se unen y que a la etiqueta. También tenga en cuenta que una propiedad se ha construido en la stringBinding
función que funciona automáticamente en esa propiedad. Esto hace que su código aspecto mucho más limpio, se puede volver a utilizar, si es necesario y es más fácil de mantener:
class HashView : View("My View") {
val inputProperty = SimpleStringProperty()
val hashProperty = inputProperty.stringBinding { computeHash(it ?: "EMPTY") }
override val root = vbox {
textfield(inputProperty)
label(hashProperty)
}
fun computeHash(t: String) = "Computed: $t"
}