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

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

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

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

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

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!

Другие вопросы по тегам