关于javaFX我们了解了它的最基本的代码如下:
import javafx.application.Application; import javafx.stage.Stage; public class HELLO extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception{ primaryStage.show(); } }
我们可以看到会显示出这样一个窗口
可以知道在main方法里调用的launch方法肯定调用了HELLO类里的start方法,因为在运行这段代码时窗口被显示出来了,但真的只调用了start方法吗?我们这里就再来实验以下。
查看API文档我们可以知道,在Application类里有三个方法需要重写,分别是init方法、start方法、stop方法,所以我们再写一个类继承Application,分别重写下这三个方法(先不把窗口显示出来),代码如下:
import javafx.application.Application; import javafx.stage.Stage; public class Life extends Application{ public static void main(String[] args) { System.out.println("main()"); launch(args); } @Override public void init() throws Exception { System.out.println("init()"); } @Override public void start(Stage primaryStage) throws Exception { System.out.println("start()"); } @Override public void stop() throws Exception { System.out.println("stop()"); } }
在所在的方法里,分别输出相对应的方法名,用来观察方法的执行情况,我们执行程序可以看到如下情况:
我们会发现程序并没有终止,并且没有调用stop方法,我们手动终止程序也不没有调用stop方法,说明手动停止程序并不能让Application"死亡"
我们再添加以下show方法,使得窗口显示出来,代码如下:
import javafx.application.Application; import javafx.stage.Stage; public class Life extends Application{ public static void main(String[] args) { System.out.println("main()"); launch(args); } @Override public void init() throws Exception { System.out.println("init()"); } @Override public void start(Stage primaryStage) throws Exception { System.out.println("start()"); primaryStage.show(); } @Override public void stop() throws Exception { System.out.println("stop()"); } }
我们可以发现在没关闭窗口之前,结果和之前一样,但当我们点击关闭按钮,可以发现如下结果:
可以发现程序停止,并且调用了stop方法,说明Application已经”死亡“
由如上我们可以知道javaFX中,必须有start方法,并且在调用launch方法时,launch先调用init方法,然后再调用start方法,当我们关闭窗口的时候,才会调用stop方法使得Application死亡。
所以,当我们启动javaFX程序,会进行以下步骤
关于线程的变化
我们先在每个方法里加入得到当前线程名的代码进行测试,代码如下:
import javafx.application.Application; import javafx.stage.Stage; public class Life extends Application{ public static void main(String[] args) { System.out.println("main() ="+Thread.currentThread().getName()); launch(args); } @Override public void init() throws Exception { System.out.println("init() ="+Thread.currentThread().getName()); } @Override public void start(Stage primaryStage) throws Exception { System.out.println("start() ="+Thread.currentThread().getName()); primaryStage.show(); } @Override public void stop() throws Exception { System.out.println("stop() ="+Thread.currentThread().getName()); } }
在还没关闭窗口前我们可以看到如下结果:
而当我们关闭窗口后可以看到如下结果:
我们可以看到当我们执行程序时,先开启mian线程,当执行init的时候,再开启JavaFX-Launcher线程,当执行start的时候再开启JavaFX Application Thread线程,随后直到关闭窗口线程才结束
javaFX学习01:关于调用launch方法的内部过程以及线程变化
原文:https://www.cnblogs.com/zengyuxiang/p/12632436.html