Экран-заставка Java Fx с пружинной загрузкой - PullRequest
0 голосов
/ 02 января 2019

JavaFX 11 и Spring Boot 2.0.

Я хочу отображать заставку, пока Spring не вставит все необходимые компоненты, а в spring.run () я хочу закрыть стадию заставки (или вминимум после x количество секунд).Такие, что при подключении к БД создаются POJO и т. Д. Но когда я пытаюсь показать свой заставочный экран до того, как поток FX начинает работать, он выдает:

Caused by: java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = main()

Я даже пытался в Platform.runLater(), но все равно не работализ.Есть ли способ обойти эту проблему?Спасибо.

public class StartUp extends Application{
    public static void main(String[] args) {
        loadSplashScreen();
        appContext = SpringApplication.run(StartUp.class);
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        stage.setScene(new Scene(root, 300, 275));
        stage.show();
    }

    static void loadSplashScreen() {
        Stage splashStage = new Stage();
        try {
            BorderPane splashPane = FXMLLoader.load(getClass().getResource("splash.fxml"));
            Scene splashScene = new Scene(splashPane);
            splashStage.setScene(splashScene);
            splashStage.show();
            setFadeInOut(splashPane, splashStage);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

    static void setFadeInOut(Parent splashScene, Stage splashStage) {
        FadeTransition fadeIn = new FadeTransition(Duration.seconds(3), splashScene);
        fadeIn.setFromValue(0);
        fadeIn.setToValue(1);
        fadeIn.setCycleCount(1);

        FadeTransition fadeOut = new FadeTransition(Duration.seconds(3), splashScene);
        fadeOut.setFromValue(1);
        fadeOut.setToValue(0);
        fadeOut.setCycleCount(1);
        fadeIn.play();

        fadeIn.setOnFinished((e) -> fadeOut.play());
        fadeOut.setOnFinished((e) -> splashStage.close());
    }
}

1 Ответ

0 голосов
/ 03 января 2019

В вашем коде у вас есть метод с именем loadSplashScreen(), который вы вызываете перед Application.launch().Это будет вызов метода launch, который запускает поток JavaFX, поэтому ваш метод loadSplashScreen() завершается сбоем, т. Е. Поток JavaFX даже не запускается при вызове этого метода.

Возможно, вы захотитеВзгляните здесь на это руководство Oracle по PreLoaders, чтобы понять, как понять базовый пример, прежде чем пытаться работать с запуском JavaFX с Spring Boot.

Хотя я не загружал JavaFX из SpringЗагрузка, я сделал подобное в пакете OSGi, и вы можете взглянуть на мой репозиторий FlexFx GitHub здесь , который может дать вам несколько советов о том, как использовать предварительный загрузчик с Spring Boot, но обратите вниманиеВ настоящее время у меня нет возможности отображать заставку в моем проекте.

Наконец, ваша проблема может возникнуть на JavaFX-8, 9 или 10. Это не относится к JavaFX-11.

...