javafx показать диалог перед init

Я хотел бы знать, лучший способ показатьdialog(Stage), прежде чем initметод основного приложения называется. Я не могу реализовать его в методе init, потому что он не работает в потоке приложения JavaFX, и при реализации его в методе start я бы потерял опцию предварительного загрузчика (который существует только во время фазы init, если я понял его правильно).

Это должно быть что-то вроде выбора рабочего пространства в eclipse или выбора каталога в lightroom.

Решение, которое я могу придумать, это создание двух программ, одной стартовой и основного приложения, но я бы предпочел, чтобы это могло произойти в том же приложении. Если это можно сделать только таким образом, как запустить главное приложение.jar с той же версией Java, что и стартер? (Он не должен вызываться с версией Java, настроенной в пути, поскольку командная строка / терминал позволяет запускать приложения с другой версией).

Спасибо за совет.

1 ответ

  1. Запуск JavaFX приложения делается через вызовApplication.launch(), где LauncherImpl#launchApplicationвызывается.

    ВlaunchApplication, частный метод launchApplicationвызывается с preloaderClass аргументом, имеющим следующую сигнатуру:

    public static void launchApplication(final Class<? extends Application> appClass,
               final Class<? extends Preloader> preloaderClass,
               final String[] args)
    

    Теперь preloader класс является местом, где вы вызываете диалоговое окно .

    Просто вызовите свой диалог и поместите свои другие функциональные возможности здесь:

    public class MyPreloader extends Preloader {
        private Stage preloaderStage;
    
        @Override
        public void start(Stage primaryStage) throws Exception {
           this.preloaderStage = primaryStage;
    
           VBox loading = new VBox(20);
           loading.setMaxWidth(Region.USE_PREF_SIZE);
           loading.setMaxHeight(Region.USE_PREF_SIZE);
           loading.getChildren().add(new ProgressBar());
           loading.getChildren().add(new Label("Please wait..."));
    
           BorderPane root = new BorderPane(loading);
           Scene scene = new Scene(root);
    
           primaryStage.setWidth(800);
           primaryStage.setHeight(600);
           primaryStage.setScene(scene);
           primaryStage.show();
       }
    
       @Override
       public void handleStateChangeNotification(StateChangeNotification   
           stateChangeNotification) {
    
           if (stateChangeNotification.getType() == Type.BEFORE_START) {
               preloaderStage.hide();
           } 
       }
    }
    

    А затем передайте его launchApplicationметоду .

    And just perfect!
    Enjoy!