1

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

它应该类似于 eclipse 中的工作区选择器或 lightroom 中的目录选择器。

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

谢谢你的建议。

4

1 回答 1

0

启动 JavaFX 应用程序是通过调用Application.launch(), 来完成的LauncherImpl#launchApplication

在 中launchApplication,使用具有以下签名的参数调用私有 方法: launchApplicationpreloaderClass

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!

于 2017-01-14T18:22:16.750 回答