加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

JavaFX程序何时调用start方法?

发布时间:2020-12-15 05:03:27 所属栏目:Java 来源:网络整理
导读:我正在学习 JavaFX.我只能在main方法中看到启动(args)方法.当我调试进入发布时.我看不到任何语句调用start().那么JavaFX程序何时调用start方法? 这是launch(args)源代码. public static void launch(String... args) { // Figure out the right class to ca
我正在学习 JavaFX.我只能在main方法中看到启动(args)方法.当我调试进入发布时.我看不到任何语句调用start().那么JavaFX程序何时调用start方法?
这是launch(args)源代码.

public static void launch(String... args) {
    // Figure out the right class to call
    StackTraceElement[] cause = Thread.currentThread().getStackTrace();

    boolean foundThisMethod = false;
    String callingClassName = null;
    for (StackTraceElement se : cause) {
        // Skip entries until we get to the entry for this class
        String className = se.getClassName();
        String methodName = se.getMethodName();
        if (foundThisMethod) {
            callingClassName = className;
            break;
        } else if (Application.class.getName().equals(className)
                && "launch".equals(methodName)) {

            foundThisMethod = true;
        }
    }

    if (callingClassName == null) {
        throw new RuntimeException("Error: unable to determine Application class");
    }

    try {
        Class theClass = Class.forName(callingClassName,true,Thread.currentThread().getContextClassLoader());
        if (Application.class.isAssignableFrom(theClass)) {
            Class<? extends Application> appClass = theClass;
            LauncherImpl.launchApplication(appClass,args);
        } else {
            throw new RuntimeException("Error: " + theClass
                    + " is not a subclass of javafx.application.Application");
        }
    } catch (RuntimeException ex) {
        throw ex;
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}

解决方法

LauncherImpl调用Application #start,但是通过PlatformImpl.runAndWait将actuall调用放到JavaFX事件队列中.这是在Preloader启动后完成的

Application#launch调用LauncherImpl.launchApplication,它创建一个Thread并调用launchApplication1,然后launchApplication通过CountDownLatch等待此Thread终止.

然后,此线程调用LauncherImpl.launchApplication1,如果指定,则启动Preloader,然后根据有关Preloader调用Application #start状态的数字决定,包含在runAndWait调用中,以确保在上下文中调用start. JavaFX的GUI /事件队列线程……

这基于Java 8

更新…

由LauncherImpl.launcherApplication1调用的theApp.start是Application的实例.

应用程序通过遍历StackTrace来查找您的类名…所有事情……

StackTraceElement[] cause = Thread.currentThread().getStackTrace();

boolean foundThisMethod = false;
String callingClassName = null;
for (StackTraceElement se : cause) {
    // Skip entries until we get to the entry for this class
    String className = se.getClassName();
    String methodName = se.getMethodName();
    if (foundThisMethod) {
        callingClassName = className;
        break;
    } else if (Application.class.getName().equals(className)
            && "launch".equals(methodName)) {

        foundThisMethod = true;
    }
}

这将获取您的类的名称,然后使用Class.forName创建一个Class实例并将其传递给LauncherImpl …

launcherApplication1然后构造此类的新实例并将其分配给引用theApp,它是应用程序的一个实例

PlatformImpl.runAndWait(new Runnable() {
        @Override public void run() {
            try {
                Constructor<? extends Application> c = appClass.getConstructor();
                app.set(c.newInstance());
                // Set startup parameters
                ParametersImpl.registerParameters(app.get(),new ParametersImpl(args));
                PlatformImpl.setApplicationName(appClass);
            } catch (Throwable t) {
                System.err.println("Exception in Application constructor");
                constructorError = t;
                error = true;
            }
        }
    });
}
final Application theApp = app.get();

然后它继续调用app.start,它调用你的应用程序的启动方法….我知道很奇怪,但它是

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读