Принудительно выполнить немедленную отрисовку в JavaFX
-
22-08-2019 - |
Вопрос
Есть ли способ заставить приложение JavaFX перерисовать себя, прежде чем продолжить?Аналогично методу Paint(Graphic g) Swing Panel (возможно, я неправильно понимаю ключевые слова).
Рассмотрим следующий пример:вы пишете приложение TicTacToe вместе с искусственным интеллектом, необходимым для компьютерного игрока.Вам бы хотелось иметь возможность показать, как два компьютерных игрока сражаются друг с другом.Возможно, вы делаете двухсекундную паузу между включениями компьютера, чтобы придать ему реалистичный эффект.Когда вы нажимаете кнопку «Вперед», происходит большая пауза бездействия (время, необходимое для прохождения 9 ходов с ложными паузами, чтобы компьютер «принял решение»), а затем внезапно визуальный элемент приложения обновляется с завершенным состояние игры.
Кажется, что JavaFX перерисовывается после завершения обработки в потоке приложения?Я здесь не совсем уверен.
Спасибо!
Решение
Ты прав.JavaFX является управляемым событиями и однопоточным.Это означает, что перерисовка и реакция на событие не могут выполняться одновременно.Длительная задача должна выполняться в отдельном потоке, чтобы она не блокировала рендеринг пользовательского интерфейса. Когда задача завершена, она может синхронизироваться обратно с потоком FX, вызвав FX.deferAction(), который просто выполнит код в основном потоке. нить.
Другие советы
Это будет не самый полезный ответ, поскольку я полдня возился с JavaFX, но не могли бы вы использовать временные шкалы, ключевые кадры и привязку для выполнения перерисовок вместо того, чтобы вызывать их явно, как вы описали?
Видеть этот урок для примера.
Модель JavaFX заключается в том, чтобы отделить вас от рисования «вещей» на экране.Это очень мощное средство, но оно отличается от того, с чем вы, возможно, знакомы.
Уэйли прав, что подходящий способ сделать это в JavaFX — создать временную шкалу, на которой перемещение выполняется каждые X секунд и будет отрисовываться в этом ключевом кадре.
Если у вас есть вопрос о том, как это сделать, попробуйте и задайте новый вопрос с помощью кода.