Ich bin eine Anwendung mit TornadoFX 1.7.11 mit Kotlin 1.1.51 auf JDK 8u121 bauen.Label Text wird nicht aktualisiert, obwohl UI-Thread reagiert scheint
Ich versuche, eine lange laufende Aufgabe in einem separaten Thread auszuführen und Fortschritt in der Benutzeroberfläche anzuzeigen, die eine Fortschrittsleiste und eine Beschriftung verwendet. Seltsamerweise wird das Etikett nicht aktualisiert. Ich dachte, dass ich die Aufgabe irgendwie auf dem UI-Thread ausgeführt habe und es hängt, aber der Fortschrittsbalken funktioniert und die Benutzeroberfläche reagiert anders (steuert die Arbeit usw.).
Ich habe auch versucht, das Etikett mit Scenic manuell bearbeiten und es funktionierte. Ich habe keine Ideen mehr, könnt ihr mir helfen?
sind hier etwas vereinfacht Code-Schnipsel:
MainView.ktclass MainView : View("") {
private val controller: MainController by inject()
override val root = borderpane {
bottom(TasksView::class)
}
init {
controller.reloadTranslations().completed.onChange {
// do some lightweight UI stuff
}
}
}
MainController.kt
class MainController : Controller() {
private val tasksController: TasksController by inject()
fun reloadTranslations(): TaskStatus {
val task = TaskStatus()
tasksController.tasks.add(task)
runAsync(task) {
updateMessage(messages["loadingTranslations"])
BibxCache.rebuild().subscribe {
updateMessage(messages["loadingTranslations"] + " " + it.loaded) // for debugging
updateProgress(it.loaded.toLong(), it.total.toLong())
}
}
return task
}
fun getTranslations() = BibxCache.values.toSortedSet()
}
TasksView.kt
class TasksView : View() {
override val root = vbox()
val controller: TasksController by inject()
init {
controller.tasks.onChange {
root.clear()
controller.tasks.map { TaskRow(it) }.forEach { root.add(it) }
}
}
}
class TaskRow(task: TaskStatus) : HBox() {
init {
val progressBar = ProgressBar(task.progress.get())
progressBar.bind(task.progress)
val label = Label(task.message.get())
label.bind(task.message)
task.message.onChange { println(it) } // for debugging
children.addAll(
progressBar,
Label(task.message.get())
)
}
}
TasksController.kt
class TasksController : Controller() {
val tasks: ObservableList<TaskStatus> = FXCollections.observableArrayList()
init {
tasks.onChange { change ->
change.next()
change.addedSubList.forEach { added ->
added.completed.onChange {
tasks.remove(added)
}
}
}
}
}
Thank you! Ich mag deinen Ansatz, er ist prägnant, lesbar und funktioniert wie erwartet. – gronostaj
Freut mich das zu hören :)) –