Экран-заставка Java Fx с пружинной загрузкой
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 ответ
В вашем коде у вас есть метод loadSplashScreen()
который вы называете до Application.launch()
, Это будет призыв к launch
метод, который запускает поток JavaFX, поэтому ваш loadSplashScreen()
метод не выполняется, т. е. поток JavaFX даже не запускается при вызове этого метода.
Возможно, вы захотите взглянуть здесь на это руководство Oracle по PreLoaders, чтобы понять, как понять базовый пример, прежде чем пытаться работать с запуском JavaFX с Spring Boot.
Хотя я не загружал JavaFX из Spring Boot, я сделал подобное в пакете OSGi, и вы могли бы взглянуть на мое репозиторий FlexFx GitHub, которое может дать вам несколько советов о том, как использовать предварительный загрузчик со Spring Загрузка, но обратите внимание, у меня в настоящее время нет возможности отображать заставку в моем проекте.
Наконец, ваша проблема может возникнуть на JavaFX-8, 9 или 10. Это не относится к JavaFX-11.