在TornadoFX中将FXTask消息绑定到Label而不进行组件耦合

时间:2018-07-19 17:22:14

标签: kotlin tornadofx

美好的一天。我想知道是否有便捷或简化的方式将FXTask的{​​{1}}和messageProperty绑定到runningProperty的{​​{1}}和Label属性是否与textPropertyvisibleWhen本身不耦合?

例如,在下面的示例应用程序中,我通过将标签的引用耦合到任务来绑定FXTask,从而引入了额外的Label。类似地,我通过将任务的引用耦合到引入额外messageProperty的标签来绑定lateinit var statusLabel

runningProperty

1 个答案:

答案 0 :(得分:1)

有一个TaskStatus对象,可以将其传递到runAsync中。该对象具有您正在运行的任务的所有有趣的属性。也无需继承Task:)

class DummyView : View("Dummy View") {
    val taskStatus = TaskStatus()

    override val root = vbox {
        button("Do task") {
            action {
                runAsync(taskStatus) {
                    updateMessage("Initializing task...")
                    (1..3).forEach {
                        Thread.sleep(1000)
                        updateMessage("Doing task: $it...")
                    }
                    Thread.sleep(1000)
                    updateMessage("Task done")
                    Thread.sleep(1000)
                }
            }
        }
        label(taskStatus.message) {
            visibleWhen(taskStatus.running)
        }
    }
}

您甚至可以通过注入自动使用taskStatus。如果不将TaskStatus的特定实例传递给runAsync,则将获得默认实例。因此,这也适用:(区别是注入了TaskStatus,并且没有TaskStatus的实例传递给runAsync)

class DummyView : View("Dummy View") {
    val taskStatus: TaskStatus by inject()

    override val root = vbox {
        button("Do task") {
            action {
                runAsync {
                    updateMessage("Initializing task...")
                    (1..3).forEach {
                        Thread.sleep(1000)
                        updateMessage("Doing task: $it...")
                    }
                    Thread.sleep(1000)
                    updateMessage("Task done")
                    Thread.sleep(1000)
                }
            }
        }
        label(taskStatus.message) {
            visibleWhen(taskStatus.running)
        }
    }
}