Сцена набора java fx из другого потока не работает

Я создаю игру, и в моем основном потоке приложения у меня запущен весь код, связанный с графическим интерфейсом, для управления реальной игрой, которая у меня есть в другом потоке, чтобы избежать блокировки потока графического интерфейса. Я запускаю код игры как вызываемый, чтобы вернуть победителя в графический интерфейс. В игровом потоке мне нужно использовать метод set scene для изменения сцены, но ничего не происходит, и я не уверен, почему. Когда игра запускается, графический интерфейс пользователя предложит игроку начать новую игру, после чего будет создан поток gameManager, который будет запущен в другом потоке. Вот пример исходного кода:

gui.getStage(scene)

Буду очень признателен за совет по этому поводу. Я проверил, что все потоки запускаются правильно, и я могу распечатать getStage, и я могу распечатать сцену, чтобы объекты были там.

Вы не можете изменить сцену (или каким-либо образом изменить пользовательский интерфейс) из фонового потока. Запланируйте это для запуска в потоке приложения FX. Я удивлен, что вы не получаете исключения, когда пытаетесь это сделать; вы раздвигаете исключения?

James_D 30.04.2018 21:49

@James_D В первый раз, когда я запустил это, я получил IncompatibleClassChangeError, но с тех пор я не смог его воссоздать. Я не раздавливаю исключения.

user6817585 30.04.2018 21:53

@James_D Если я воспользуюсь запуском позже, не будет ли он просто заблокировать основной поток?

user6817585 30.04.2018 21:55

Нет; нет, если вы не сделаете что-то длительное в потоке приложения FX. Просто выполните обновления пользовательского интерфейса (что не займет много времени) в потоке приложения FX. Вы должны создать минимальный воспроизводимый пример и опубликовать его в своем вопросе.

James_D 30.04.2018 21:56

@James_D будет работать на примере обновления, задняя часть игры включает блокировку в цикле while, пока не будет нажата кнопка, поэтому я предполагаю, что это не подходит для запуска позже, или это будет нормально? Я знаю, что лучше иметь слушателей событий и реагировать на нажатия кнопок, а не ждать, пока кнопка будет нажата, но в моем брифинге указано, что я делаю это следующим образом: /

user6817585 30.04.2018 22:12

Вам действительно не нужно делать это таким образом. Нажатие кнопки генерирует событие; нет смысла сидеть и ничего не делать, только чтобы что-то делать при нажатии кнопки. Просто сделайте то, что нужно сделать (включая запуск нового потока, если необходимо) в обработчике событий для кнопки.

James_D 30.04.2018 22:13

@James_D, поток сидит только на короткое время, и я обычно не буду этого делать, но мне нужно, как мне сказали, я только что попытался использовать запуск позже, и он блокирует основной поток. Разве это не обходится?

user6817585 30.04.2018 22:50

Вы не можете заблокировать поток приложения FX. Если вам действительно нужно сделать это таким образом, вы должен выполняете блокировку в фоновом потоке, а затем, когда вы разблокируете обновления пользовательского интерфейса, должен происходит в потоке приложения FX через Platform.runLater(). Даже если вам удобно блокировать поток приложения FX на короткое время (чего не должно быть), любые уведомления о нажатии кнопок происходят в потоке приложения FX, поэтому они не могут происходить, пока поток заблокирован, а вы завершаете в тупик.

James_D 30.04.2018 22:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
327
0

Другие вопросы по теме