我想知道在调用主应用程序的dialog(Stage)
方法之前显示init
的最佳方法。我无法在init方法中实现它,因为它不能在JavaFX应用程序线程上运行,并且在start方法中实现它时,我会松开预加载器的选项(如果我理解它,它只在init阶段存在)正确地)。
应该像eclipse中的工作区选择器或lightroom中的目录选择器。
我能想到的解决方案是创建两个程序,一个启动器和主应用程序,但如果它可以在同一个应用程序中发生,我更愿意。如果只能以这种方式完成,如何使用与启动器启动时相同的Java版本启动主 app.jar ?(不能是使用在路径中配置的Java版本调用,因为命令行/终端允许使用不同版本启动应用程序。)
感谢您的建议。
答案 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!
强>