Проблемы, часто встречающиеся с этим типом кода для новичков, делают sleep
или какую-либо другую длительную операцию в потоке приложения для создания анимации. Однако блокировка потока приложения javafx приводит к тому, что сцена не обновляется, что приводит к зависанию графического интерфейса.
Вам либо нужно переместить долго выполняющиеся части этой анимации в фоновый поток и использовать Platform.runLater
длялюбые обновления графического интерфейса или использовать что-то, предназначенное именно для этой цели. Есть несколько классов, которые могут быть полезны в пакете javafx.animation
, но наиболее удобным из них является Timeline
:
. Сохраните последовательность движений в подходящей структуре данных и используйте Timeline
. чтобы регулярно вызывать обработчик событий для обновления графического интерфейса:
List<FieldIndices> fieldIndices = ...
final Iterator<FieldIndices> iterator = fieldIndices.iterator();
final Timeline timeline = new Timeline();
timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(1), evt -> {
if (iterator.hasNext()) {
moveButterfly(iterator.next());
} else {
removeButterfly();
timeline.stop();
}
}));
timeline.setCycleCount(Animation.INDEFINITE); // repeat until stop is called
timeline.play();
Теперь вам остается только выполнить чтение данных в список и реализовать логику перемещения бабочки на новую позицию.
Обратите внимание, что на самом деле я не рекомендую использовать более двух сцен: пользователь будет ожидать одинаковое положение для кнопок и «полей», показывающих бабочку. Если вы проектируете 2 fxmls, любая корректировка одной сцены потребует от вас такой же корректировки для другой сцены. Это делает макет сложным в обслуживании. Альтернатива требует, чтобы вы создали сцену в Java-коде, но повторяющаяся природа сцен делает это хорошей идеей в любом случае. (Альтернативой является внедрение 16 полей в контроллер и сбор их в подходящую структуру данных. Это подвержено ошибкам, и любое изменение одной из кнопок, вероятно, потребует 16 изменений в fxml. Используйте вложенный цикл for, и вам нужно написатьлогика создания кнопки только один раз для сохранения кнопок, например, во вложенном массиве, может выполняться одновременно ...)