Java 9 JavaFX Preloader

前端 未结 3 1320
春和景丽
春和景丽 2020-12-16 04:34

In Java 8 I can launch a JavaFX application with a preloader using the following method:

LauncherImpl.launchApplication(WindowMain.class, WindowMainPreloader         


        
相关标签:
3条回答
  • 2020-12-16 05:07

    from jdk 9, LauncherImpl not work jdk 10 - java.graphics module-info.java

    all classes in package com.sun.javafx.application exported to special modules (java.base,javafx.controls,javafx.deploy,javafx.swing,javafx.web),

    So if you add module (javafx.graphics) in your module its not work,

    so use : System.setProperty("javafx.preloader",path_class_loader) as an alternative to LauncherImpl for jkd 9 and above

    0 讨论(0)
  • 2020-12-16 05:10

    There is a comment on the answer to this question:

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

    system property javafx.preloader=classname seems to work too.

    I didn't try it, but perhaps you could try setting that property and just launching your main app via the public Application.launch(appClass, args) API and perhaps the preloader will launch first.

    Looking into the code for Application.launch, it seems that this would work. Here is the code which is eventually invoked, copied from the Java 8 source:

    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);
    }
    

    So you should be able to launch an app with a preloader using:

    System.setProperty("javafx.preloader", "my fully qualified preloader class name");
    Application.launch(myMainClass, args);
    
    0 讨论(0)
  • 2020-12-16 05:23

    JDK 8:

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

    JDK 9:

    System.setProperty("javafx.preloader", Preloader.class.getCanonicalName());
        Application.launch(Main.class, arguments);
    
    0 讨论(0)
提交回复
热议问题