在的Hello World教程的JavaFX的说:
当与JavaFX的打包工具,该工具嵌入JavaFX的启动器在JAR文件中创建该应用程序的JAR文件,不需要为JavaFX应用的主要()方法。但是,这样你就可以运行了,而不JavaFX的启动,创建JAR文件是非常有用的包括main()方法,例如使用IDE中,JavaFX的工具没有完全集成时。同样,嵌入JavaFX代码Swing应用程序所需要的main()方法。
我想这和它的真实,我可没有启动我的应用程序main
的方法。
然而,当我宣布一个main
方法调用一个launch
从Application
类,该计划仍然有效。的文档应用说,该JavaFX运行时创建的实例Application
类,并调用init
方法。
但如何JavaFX运行开始?我的意思是,必须有一个main
方法的地方,一切开始。所以荫想知道如果我声明main
我自己的方法,还有的arent他们两个?
我其实一直很感兴趣在Java中推出的JavaFX应用程序如何,所以我决定来调试过程。答案的其余部分之前有些事情:
Application
我指的是javafx.application.Application
类。main
方法”,我指的是public static void main(String[] args)
方法。类似地,“主类”是指包含所述类main
方法。当启动一个JavaFX应用程序,如果主类的子类Application
,则Java启动使用它自己的,内部的主类。这个内部类是负责初始化的JavaFX工具包。一旦该工具包被初始化,以下两种情况之一可能发生。
Application
子类具有一个main
方法。
main
方法。现在是开发商的责任,以完成启动通过应用程序Application.launch
。Application
子类没有一个main
方法。
基本上,任何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
Main-Class: foo.Main
这些步骤假定JavaFX应用程序。大多数的这种不一样,如果推出一个“正规”的Java应用程序发生。
一个内部类,LauncherHelper
,支票和载荷通过命名方法中的主要类checkAndLoadMain
。此方法是负责解决基于主类是如何声明的主类(如上所述)。一旦发现,该方法检查是否主类是的一个子类Application
。如果是,那么主类变为静态内部类:LauncherHelper$FXHelper
。然后进行一些验证和Class
返回,我认为,本地代码。
相关的代码:
java.base/sun.launcher.LauncherHelper
java.base/sun.launcher.LauncherHelper.checkAndLoadMain
java.base/sun.launcher.LauncherHelper$FXHelper
main
方法主类已被发现后,加载和验证,它是从所谓的(我认为)的本机代码。由于我们是在谈论一个JavaFX应用程序的主类是现在LauncherHelper$FXHelper
。在main
这个类的方法确实一件简单的事情:通过反射调用内部JavaFX代码。
相关的代码:
由步骤2调用的代码是一个命名的类内LauncherImpl
; 具体地,launchApplication(String,String,String[])
方法。这种方法似乎做类似的事情,LauncherHelper.checkAndLoadMain
只是更具体的JavaFX的。
我相信这个方法类似于checkAndLoadMain
因为checkAndLoadMain
方法验证了FXHelper
类,这显然是有效的。然而,launchApplication
需要验证的Application
子类。
相关的代码:
javafx.graphics/com.sun.javafx.application.LauncherImpl
javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication
被叫next方法launchApplicationWithArgs(ModuleAccess,String,String,String[])
。这种方法是负责启动的JavaFX工具包。在此之后,它加载Application
子和,如果存在的话,Preloader
子类作为实际Class
情况。它这样做是对的JavaFX应用程序线程,但然后返回到主线程。
然后,该代码发生的取决于存在两个路径一个main
在该方法Application
的子类:
main
方法存在:继续执行步骤5。main
方法不存在:继续执行步骤6(直接启动的应用程序)相关的代码:
main
的方法Application
的子类(可选)如果有一个main
在该方法Application
的子类它通过反射调用。现在是开发商的责任,通过将呼叫继续启动程序Application.launch
。有对的两个重载launch
方法:
Application.launch(String...)
Application.launch(Class,String)
作为第一选项的唯一区别使用主叫Class
作为JavaFX的Application
子类。双方最终调用LauncherImpl.launchApplication(Class,String[])
。这后一种方法简单地加载Class
的Preloader
,如果需要的话,然后继续到下一个步骤。
相关的代码:
javafx.graphics/javafx.application.Application.launch(String...)
javafx.graphics/javafx.application.Application.launch(Class,String...)
javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication
现在,我们的LauncherImpl.launchApplication(Class,Class,String[])
方法。这种方法做两个简单的:
LauncherImpl.launchApplication1(Class,Class,String[])
Application.launch
的)CountDownLatch
,直到JavaFX的工具箱退出。的launchApplication1
,如果它尚未启动方法将启动的JavaFX工具包。然后继续到实现标准JavaFX的生命周期。这包括创建Application
和,如果存在的话,Preloader
类然后调用init()
,并start(Stage)
在适当的线程在适当的时间的方法。这个生命周期是公开定义的行为; 几乎一切这里提到的是实施细节。
相关的代码:
javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication
javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1
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.launch
中Main
开始,在最后步骤了这一过程:6,这就是为什么该launchApplication1
方法还试图,因为它不会一直在这种情况下开始启动的JavaFX工具包。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句