Kotlin TornadFX:更新runAsync内部的标签时出错

Kotlin TornadFX:更新runAsync内部的标签时出错,kotlin,tornadofx,Kotlin,Tornadofx,我尝试使用Kotlin和TornadoFX库中的套接字连接实现一个聊天应用程序,以制作GUI。 当我尝试启动客户机时会出现问题,因为它一直在等待来自服务器的消息,尽管我将更新标签和接收消息的代码放在runAsync中。我查看了TornadoFX文档并观看了youtube视频,但我无法找到解决方案。 我知道问题是程序被卡在了那个块,但不知道怎么做 class MyFirstView: View("Chat"){ var input: TextField by single

我尝试使用Kotlin和TornadoFX库中的套接字连接实现一个聊天应用程序,以制作GUI。 当我尝试启动客户机时会出现问题,因为它一直在等待来自服务器的消息,尽管我将更新标签和接收消息的代码放在runAsync中。我查看了TornadoFX文档并观看了youtube视频,但我无法找到解决方案。 我知道问题是程序被卡在了那个块,但不知道怎么做

    class MyFirstView: View("Chat"){

        var input: TextField by singleAssign()
        var test = SimpleStringProperty()
        val client: Client by inject()

        init {
            client.connect()
            val t = thread(true) {
                 while (true) {
                      random = client.getMessage()
                      println(random)
                      Platform.runLater { test.set(random) }
                 }
            }
        }

        override val root = vbox {
            hbox {
                label(test) {
                    bind(test)
                }
            }
            hbox {
                label("Write here some text")
                input = textfield()
            }
            hbox {
                button("Send") {
                    action{
                        client.writer.println(input.text)
                    }
                }
            }
        }
    }

您只能更新UI线程上的UI元素,因此如果您想从后台线程操作UI,则需要在
runLater{}
中包装该特定代码


另一方面,您不应该使用singleAssign操作textfield的文本或存储ui元素引用。相反,您应该将textfield绑定到StringProperty并操作该值。这在指南中有介绍,请查看:)

我更新了代码并更改了构造函数,看起来效果不错。我在init块中添加了一个线程