【问题标题】:Java 9 JavaFX PreloaderJava 9 JavaFX 预加载器
【发布时间】:2017-11-28 13:59:25
【问题描述】:

在 Java 8 中,我可以使用以下方法启动带有预加载器的 JavaFX 应用程序:

LauncherImpl.launchApplication(WindowMain.class, WindowMainPreloader.class, 
new String[]{...});

我更喜欢像上面那样从代码启动它,而不是使用部署配置,因为我不希望每次启动应用程序时都启动图形界面,而只是在一些计算出应用程序的代码之后应该在 GUI 模式下运行。

我使用的是“com.sun.javafx.application.LauncherImpl”类,但显然在 Java 9 中,所有以“com.sun”开头的类都被删除了。那么,如何在 Java 9 中使用预加载器启动应用程序?

【问题讨论】:

    标签: java javafx java-9 preloader javafx-9


    【解决方案1】:

    对这个问题的答案有评论:

    How to create splash screen as a Preloader in JavaFX standalone application?

    系统属性javafx.preloader=classname 似乎也可以工作。

    我没有尝试过,但也许您可以尝试设置该属性并通过公共 Application.launch(appClass, args) API 启动您的主应用程序,也许预加载器将首先启动。

    查看Application.launch 的代码,这似乎可行。下面是最终调用的代码,从 Java 8 源代码复制而来:

    public static void launchApplication(final Class<? extends Application> appClass,
            final String[] args) {
    
        Class<? extends Preloader> preloaderClass = savedPreloaderClass;
    
        if (preloaderClass == null) {
            String preloaderByProperty = AccessController.doPrivileged((PrivilegedAction<String>) () ->
                    System.getProperty("javafx.preloader"));
            if (preloaderByProperty != null) {
                try {
                    preloaderClass = (Class<? extends Preloader>) Class.forName(preloaderByProperty,
                            false, appClass.getClassLoader());
                } catch (Exception e) {
                    System.err.printf("Could not load preloader class '" + preloaderByProperty +
                            "', continuing without preloader.");
                    e.printStackTrace();
                }
            }
        }
    
        launchApplication(appClass, preloaderClass, args);
    }
    

    因此,您应该能够使用以下方式启动带有预加载器的应用:

    System.setProperty("javafx.preloader", "my fully qualified preloader class name");
    Application.launch(myMainClass, args);
    

    【讨论】:

      【解决方案2】:

      从 jdk 9 开始,LauncherImpl 不起作用 jdk 10 - java.graphics module-info.java

      com.sun.javafx.application中的所有类都导出到特殊模块(java.base,javafx.controls,javafx.deploy,javafx.swing,javafx.web)

      所以如果你在你的模块中添加模块(javafx.graphics)它就不起作用了,

      所以使用:System.setProperty("javafx.preloader",path_class_loader) 作为LauncherImpl 的替代jkd 9 及以上

      【讨论】:

      • 不知道为什么这被否决了,这为我解决了。
      【解决方案3】:

      JDK 8:

      LauncherImpl.launchApplication(Main.class, Preloader.class, arguments);
      

      JDK 9:

      System.setProperty("javafx.preloader", Preloader.class.getCanonicalName());
          Application.launch(Main.class, arguments);
      

      【讨论】:

        猜你喜欢
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-04
        • 1970-01-01
        相关资源
        最近更新 更多