Как автоматически запустить код из новой сцены javafx - PullRequest
0 голосов
/ 06 ноября 2019

Я совершенно новичок в Java и изучаю его при разработке приложения для школьного проекта.

Ссылка на изображение

Я хочу закодировать вышеуказанную программу,В нем

  1. Пользователь нажмет кнопку Готов на экране 1.
  2. Затем появится второй экран и изображение бабочки будет показано в указанном мной порядке [Предустановка]с использованием файла CSV] Как показано на экранах 2 и 3.
  3. Наконец, в сетке появится набор кнопок, и пользователь должен выбрать кнопки в порядке появления бабочки.

Я застрял в поиске способа запустить экран 2 и автоматически воспроизвести последовательность бабочек.

Я попытался поместить image.setimage() в блок initialize () на моем экране 2Контроллер с задержкой между каждым изображением (). но это не работает.

Кто-нибудь может подсказать мне способ справиться с такого рода задачами? Заранее большое спасибо.

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

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

0 голосов
/ 06 ноября 2019

Как я понимаю, вы хотите сыграть последовательность бабочек после показа 2-го этапа ... Чтобы достичь этого, вы можете попробовать что-то вроде:

List positions = new ArrayList(); //places to show butterfly (e.g. table cells)
secondStage.setOnShown(windowEvent -> {
    // update UI with Pltform.runLater()
    // moveButerflyTo() is your method to place butterfly on given place
    positions.forEach(position -> Platform.runLater(() -> moveButerflyTo(position)));
});

Я не пробовал это, но он справился с работой...

...