java - 带有 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());
}
}
解决方案
在您的代码中,您有一个调用的方法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。
推荐阅读
- pytorch - Pytorch NLLLOSS 的理解
- swift - 在 swift ui 中创建 Json 数组
- java - 随机的 IllegalArgumentException
- unity3d - 类型“Bunny”已经定义了一个名为“OnTriggerEnter2D”的成员,具有相同的参数类型 | 如何在单个脚本中进行多次碰撞
- php - 如何确保文件的 MIME 类型是 PHP Laravel 中的任何图像格式?
- python - 如何为句子级嵌入设置 LSTM 的输入形状
- c# - c#用户控件标签中的windows窗体TextBox onChange事件,用于用户控件的自定义文本属性
- testing - 在超级账本结构的测试网络中创建通道失败
- reporting-services - SSRS 报告 - 查找当前正在呈现的 tablix
- excel - 通过电子邮件地址进行 VLOOKUP 搜索在 LibreOffice 或 Google 表格中不起作用