TornadoFX: ошибка при обновлении метки внутри runAsync - PullRequest
1 голос
/ 17 июня 2020

Я попытался реализовать чат-приложение, используя соединение сокета в Kotlin и библиотеку TornadoFX, чтобы сделать GUI. Проблема возникает, когда я пытаюсь запустить клиент, потому что он продолжает ждать сообщения от сервера, хотя я помещаю этот код, который обновляет метку и получает сообщение внутри runAsyn c. Я красил документацию 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)
                    }
                }
            }
        }
    }

1 Ответ

2 голосов
/ 17 июня 2020

Вы можете обновлять элементы пользовательского интерфейса только в потоке пользовательского интерфейса, поэтому, если вы хотите управлять пользовательским интерфейсом из фонового потока, вам необходимо обернуть этот конкретный код в runLater { }.

В другом примечании вы не следует манипулировать текстом текстового поля или хранить ссылки на элементы пользовательского интерфейса с помощью singleAssign. Вместо этого вы должны привязать свое текстовое поле к StringProperty и вместо этого манипулировать значением. Это описано в руководстве, так что проверьте это :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...