Java 9 JavaFX 预加载器
Java 9 JavaFX Preloader
在 Java 8 中,我可以使用以下方法启动带有预加载器的 JavaFX 应用程序:
LauncherImpl.launchApplication(WindowMain.class, WindowMainPreloader.class,
new String[]{...});
我更喜欢像上面那样从代码启动它,而不是使用部署配置,因为我不希望图形界面在我每次启动应用程序时都启动,但只有在一些代码计算出它之后才启动应用程序应该 运行 在 GUI 模式下。
我使用的是 class "com.sun.javafx.application.LauncherImpl",但显然在 Java 9 中所有以 "com.sun" 开头的 class 都被删除了。那么,如何在 Java 9 中使用预加载器启动应用程序?
本题答案有评论:
system property javafx.preloader=classname
seems to work too.
我没试过,但也许你可以尝试设置 属性 并通过 public 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);
来自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
及以上
JDK 8:
LauncherImpl.launchApplication(Main.class, Preloader.class, arguments);
JDK 9:
System.setProperty("javafx.preloader", Preloader.class.getCanonicalName());
Application.launch(Main.class, arguments);
在 Java 8 中,我可以使用以下方法启动带有预加载器的 JavaFX 应用程序:
LauncherImpl.launchApplication(WindowMain.class, WindowMainPreloader.class,
new String[]{...});
我更喜欢像上面那样从代码启动它,而不是使用部署配置,因为我不希望图形界面在我每次启动应用程序时都启动,但只有在一些代码计算出它之后才启动应用程序应该 运行 在 GUI 模式下。
我使用的是 class "com.sun.javafx.application.LauncherImpl",但显然在 Java 9 中所有以 "com.sun" 开头的 class 都被删除了。那么,如何在 Java 9 中使用预加载器启动应用程序?
本题答案有评论:
system property
javafx.preloader=classname
seems to work too.
我没试过,但也许你可以尝试设置 属性 并通过 public 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);
来自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
及以上
JDK 8:
LauncherImpl.launchApplication(Main.class, Preloader.class, arguments);
JDK 9:
System.setProperty("javafx.preloader", Preloader.class.getCanonicalName());
Application.launch(Main.class, arguments);