JavaFX运行的主要方法

莫里茨·施密特:

的Hello World教程的JavaFX的说:

当与JavaFX的打包工具,该工具嵌入JavaFX的启动器在JAR文件中创建该应用程序的JAR文件,不需要为JavaFX应用的主要()方法。但是,这样你就可以运行了,而不JavaFX的启动,创建JAR文件是非常有用的包括main()方法,例如使用IDE中,JavaFX的工具没有完全集成时。同样,嵌入JavaFX代码Swing应用程序所需要的main()方法。

我想这和它的真实,我可没有启动我的应用程序main的方法。

然而,当我宣布一个main方法调用一个launchApplication类,该计划仍然有效。的文档应用说,该JavaFX运行时创建的实例Application类,并调用init方法。

但如何JavaFX运行开始?我的意思是,必须有一个main方法的地方,一切开始。所以荫想知道如果我声明main我自己的方法,还有的arent他们两个?

色拉:

我其实一直很感兴趣在Java中推出的JavaFX应用程序如何,所以我决定来调试过程。答案的其余部分之前有些事情:

  • 我做了JDK-10调试为一个独立的桌面应用程序。在JDK-11的源代码一些睥睨建议的过程中没有更改版本之间。
  • 当我使用Application我指的是javafx.application.Application类。
  • 当我用“ main方法”,我指的是public static void main(String[] args)方法。类似地,“主类”是指包含所述类main方法。
  • 所有链接以获取源代码点在OpenJDK Mercurial库。
  • 事实上,所有的这是一个实现细节,并随时更改,恕不另行通知。

摘要

当启动一个JavaFX应用程序,如果主类的子类Application,则Java启动使用它自己的,内部的主类这个内部类是负责初始化的JavaFX工具包。一旦该工具包被初始化,以下两种情况之一可能发生。

  1. Application子类具有一个main方法。
    • 在这种情况下,一些内部JavaFX代码调用main方法。现在是开发商的责任,以完成启动通过应用程序Application.launch
  2. Application子类没有一个main方法。
    • 在这种情况下,相同的内部JavaFX代码启动应用程序本身。第一种情况,最终在这种情况下做同样的地方结束。

基本上,任何main方法中声明Application子类是不“正常”的main方法。想想这种行为是这样的:

  • 内部main法充当入口点的Java应用程序,就像所有“正常”的main方法
  • Application子类main的方法作为一个可选的入口点JavaFX应用程序,其中的JavaFX工具包已经被初始化。

详细的解答

首先,它是不是这样的,你“覆盖”了main该方法Application的类; Application班有没有main方法。实际发生的是,Java使用它,每当应用程序的声明主要是类的子类自己的主类Application对于后人,一个主类可以使用下面的一个声明:

  • 指定的命令行(文件)上: java -cp <classpath> foo.Main
  • 指定的命令行(模块)上: java -p <modulepath> -m foo/foo.Main
  • 指定它在JAR清单: Main-Class: foo.Main
  • (另一种方式,我忘了?)

步骤

这些步骤假定JavaFX应用程序。大多数的这种不一样,如果推出一个“正规”的Java应用程序发生。

步骤1:装入主类

一个内部类,LauncherHelper,支票和载荷通过命名方法中的主要类checkAndLoadMain此方法是负责解决基于主类是如何声明的主类(如上所述)。一旦发现,该方法检查是否主类是的一个子类Application如果是,那么主类变为静态内部类:LauncherHelper$FXHelper然后进行一些验证和Class返回,我认为,本地代码。

相关的代码:

步骤2:调用main方法

主类已被发现后,加载和验证,它是从所谓的(我认为)的本机代码。由于我们是在谈论一个JavaFX应用程序的主类是现在LauncherHelper$FXHelpermain这个类的方法确实一件简单的事情:通过反射调用内部JavaFX代码。

相关的代码:

步骤3:JavaFX的预启动

由步骤2调用的代码是一个命名的类内LauncherImpl; 具体地,launchApplication(String,String,String[])方法。这种方法似乎做类似的事情,LauncherHelper.checkAndLoadMain只是更具体的JavaFX的。

我相信这个方法类似于checkAndLoadMain因为checkAndLoadMain方法验证了FXHelper类,这显然是有效的。然而,launchApplication需要验证的Application子类。

相关的代码:

第4步:JavaFX的启动

被叫next方法launchApplicationWithArgs(ModuleAccess,String,String,String[])这种方法是负责启动的JavaFX工具包。在此之后,它加载Application子和,如果存在的话,Preloader子类作为实际Class情况。它这样做是对的JavaFX应用程序线程,但然后返回到主线程。

然后,该代码发生的取决于存在两个路径一个main在该方法Application的子类:

  1. main方法存在:继续执行步骤5。
  2. main方法不存在:继续执行步骤6(直接启动的应用程序)

相关的代码:

步骤5:调用main的方法Application的子类(可选)

如果有一个main在该方法Application的子类它通过反射调用。现在是开发商的责任,通过将呼叫继续启动程序Application.launch有对的两个重载launch方法:

  1. Application.launch(String...)
  2. Application.launch(Class,String)

作为第一选项的唯一区别使用主叫Class作为JavaFX的Application子类。双方最终调用LauncherImpl.launchApplication(Class,String[])这后一种方法简单地加载ClassPreloader,如果需要的话,然后继续到下一个步骤。

相关的代码:

第6步:完成启动JavaFX应用程序

现在,我们的LauncherImpl.launchApplication(Class,Class,String[])方法。这种方法做两个简单的:

  1. 创建并启动JavaFX的启动线程能够调用其他方法
    • LauncherImpl.launchApplication1(Class,Class,String[])
  2. 园内主线程(或任何线程调用Application.launch的)CountDownLatch,直到JavaFX的工具箱退出。

launchApplication1,如果它尚未启动方法将启动的JavaFX工具包。然后继续到实现标准JavaFX的生命周期。这包括创建Application和,如果存在的话,Preloader类然后调用init(),并start(Stage)在适当的线程在适当的时间的方法。这个生命周期是公开定义的行为; 几乎一切这里提到的是实施细节。

相关的代码:

Application主类

还有另一种方式来推出JavaFX应用程序,其中主类是没有的子类Application,如下所示:

// main class
public class Main {

    public static void main(String[] args) {
        Application.launch(App.class, args);
    }

}

// JavaFX Application class
public class App extends Application {

    @Override 
    public void start(Stage primaryStage) throws Exception {
        // setup and show primaryStage
    }

}

由于Main不是的一个子类Application的变化FXHelper,在步骤1中,不会发生。这也意味着,步骤2-5不会自动发生。相反,在调用Application.launchMain开始,在最后步骤了这一过程:6,这就是为什么该launchApplication1方法还试图,因为它不会一直在这种情况下开始启动的JavaFX工具包。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章