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!