我想显示一个启动屏幕,直到 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());
}
}
loadSplashScreen()
的方法,您可以在
Application.launch()
之前调用该方法。这将是对
launch
方法的调用,从而启动 JavaFX 线程,这就是您的
loadSplashScreen()
方法失败的原因,即调用此方法时,JavaFX 线程甚至还没有启动。在尝试使用 Spring Boot 启动 JavaFX 之前,您可能需要查看
此处有关 PreLoaders 的 Oracle 教程,了解如何理解基本示例。
虽然我还没有从 Spring Boot 启动 JavaFX,但我在 OSGi 包中做了类似的事情,你可能想看看我的 FlexFx GitHub 存储库这里,它可能会为你提供一些关于如何使用预配置的指导。使用 Spring Boot 加载程序,但请注意,我目前无法在我的项目中显示启动屏幕。
最后,您的问题会发生在 JavaFX-8、9 或 10 上。它不是 JavaFX-11 特有的。