首页 > 解决方案 > 带有 Spring Boot 的 Java Fx 启动画面

问题描述

JavaFX 11 和 Spring Boot 2.0。

我想显示一个启动画面,直到 Spring 初始化所有必要的 bean,并且在 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());
    }
}

标签: javaspring-bootjavafxjavafx-11

解决方案


在您的代码中,您有一个调用的方法loadSplashScreen(),您在Application.launch(). 它将是对launch启动 JavaFX 线程的方法的调用,这就是您的loadSplashScreen()方法失败的原因,即在调用此方法时 JavaFX 线程甚至还没有启动。

在您尝试使用 Spring Boot 启动 JavaFX 之前,您可能需要在此处查看有关 PreLoaders 的 Oracle 教程,以了解如何理解基本示例。

虽然我没有从 Spring Boot 启动 JavaFX,但我在 OSGi 包中做了类似的事情,您可能想看看我的 FlexFx GitHub 存储库它可能会为您提供一些关于如何使用 Spring 的预加载器的指示启动但请注意我目前无法在我的项目中显示启动画面。

最后,您的问题将发生在 JavaFX-8、9 或 10 上。它并非特定于 JavaFX-11。


推荐阅读