Вы не можете вызвать цикл Thread.sleep()
и / или while
в потоке приложений JavaFX, поскольку это приведет к остановке графического интерфейса и ожиданию окончания цикла.
Решениеждать, используя другой поток, но JavaFX не позволяет изменять какие-либо узлы из вторичных потоков.
Да, вы не должны изменять граф сцены из потоков приложений, отличных от JavaFX, но это нене остановит вас от вызова Platform.runLater()
для строки (ей) кодов, которые делают фактическую модификацию.Вы также можете использовать Задача для достижения этой цели.
Трудно предложить какое-либо конкретное решение, потому что я понятия не имею, как обновляется флаг listener
.
Редактировать
Я не заметил, что метод start()
принадлежит подклассу Thread
, пока Фабиан не указал на это.Вам никогда не следует переопределять Thread.start()
, и, что еще хуже, не вызывать super.start()
, когда вы переопределяете его.
Итак, здесь произошло то, что ваш класс GameEngine
больше не работает как Thread
.Вызов engine.start()
просто выполняет любой код, который вы написали в переопределении, в любом вызываемом потоке engine.start()
(который является Потоком приложения JavaFX, потому что вы заключили его в Platform.runLater()
).
Есливы по-прежнему предпочитаете расширять Thread
, тогда вам следует переместить код для переопределения Thread.run()
.Также обратите внимание, что вы должны удалить Platform.runLater()
в initialize()
и поместить его в любые коды, которые будут влиять на GUI.
Например:
Platform.runLater(() -> {
myLabel.setText("User typed" + input);
});