2017-01-14 9 views
0

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

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

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

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

+0

Почему вы должны сделать это? Метод init() 'является частью инициализации жизненного цикла приложения FX: вы вряд ли можете ожидать выполнения части вашего приложения до его завершения. Почему бы просто не показать диалог в методе 'start()', как обычно, а затем, когда диалог будет уволен, выполните всю необходимую обработку перед отображением основного окна приложения? –

+0

@James_D Я хотел бы сделать это, потому что код, занимающий достаточно времени для предварительного загрузчика/заставки, появляется после выбора пользователя и, насколько я понимаю, жизненный цикл preloaders во время 'init()' метода, таким образом, пользователь может подождите несколько секунд, прежде чем появится основное приложение Stage, не увидев индикатор выполнения. Это означает, что мне не нужен предварительный загрузчик и не открывайте диалоговое окно с оформлением меньше, чем прогресс, указывающий на экран заставки в методе 'start()', пока не будет отображаться основная сцена. – Scourge

+1

Итак, вы можете просто использовать механизм предварительного натяжения.Хотя проще (imo) показать заставку с индикатором выполнения из метода 'start()', делать то, что вы делаете, что занимает столько времени в задании в фоновом потоке и показывать главный экран, когда это будет завершено , –

ответ

0

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

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

Теперь 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!

+0

Спасибо за ваш ответ, но я действительно не понимаю, как это должно быть сделано. Я имею в виду, что диалог должен появиться еще до того, как основное приложение начнет инициализироваться (таким образом, до того, как будет отображаться Preloader), поскольку действие пользователя в этом диалоговом окне должно установить важную переменную для init-метода или даже отменить весь запуск. Или вопрос, связанный с вашей идеей: когда я должен поместить его в preloader, как мне заставить метод init ждать ввода пользователем для продолжения инициализации и до сих пор демонстрировать «заставку» предварительного загрузчика? – Scourge

+0

Но у вас есть объект Stage в вашем распоряжении нет? – GingerHead

+0

Да, у меня есть это, но оставшийся вопрос заключается в том, как заблокировать метод init() 'для основных приложений, прежде чем пользователь сделает выбор? Другой подход, реализующий выбор пользователя, заставку и загрузку в методе 'start()' основного приложения, возможен, но приведет к созданию менее чистой структуры. – Scourge

 Смежные вопросы

  • Нет связанных вопросов^_^