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