javafx在init

时间:2017-01-14 18:06:50

标签: java javafx-8 startup launcher preinit

我想知道在调用主应用程序的dialog(Stage)方法之前显示init的最佳方法。我无法在init方法中实现它,因为它不能在JavaFX应用程序线程上运行,并且在start方法中实现它时,我会松开预加载器的选项(如果我理解它,它只在init阶段存在)正确地)。

应该像eclipse中的工作区选择器或lightroom中的目录选择器。

我能想到的解决方案是创建两个程序,一个启动器和主应用程序,但如果它可以在同一个应用程序中发生,我更愿意。如果只能以这种方式完成,如何使用与启动器启动时相同的Java版本启动主 app.jar (不能是使用在路径中配置的Java版本调用,因为命令行/终端允许使用不同版本启动应用程序。)

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

启动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!