JavaFX 程序启动顺序

104 篇文章 5 订阅

JavaFX 运行时会创建多个线程处理程序,不同线程在程序的不同阶段处理不同任务。JavaFX 在程序运行阶段主要有以下四个方法:

      The no-args constructor

      The init() method

      The start() method

      The stop() method

      创建顺序依次。

      有两个线程:

      JavaFX-Launcher 和 JavaFX Application Thread 分别处理以上方法,其中 init () 方法由 JavaFX-Launcher 线程创建,其余三个方法由 JavaFX Application Thread。The no-args constructor 用来创建继承 Application 的子类的实例,是 JavaFX 的主程序,第一个创建;随后调用 init () 方法,加载程序运行中需要的各项资源,init () 方法不可用来创建 Stage 或 Scene 的实例(实测创建 Stage 实例会导致抛出异常,Scene 不会),如创建则会抛出异常;start () 方法用来创建 Stage 和 Scene,并将其显示给用户;stop () 方法在结束程序是调用,在 Application 此方法体为空,程序员可以 override 此方法。

      以下是测试代码,验证以上四个方法的调用情况。

public class FXLifeCycleApp extends Application {
	public FXLifeCycleApp() {
		String name = Thread.currentThread().getName();
		System.out.println("no-args Custructor : " + name);

        stageInClass = new Stage();

		//在init方法中create Scene或Stage都会导致报错
		Scene scene = new Scene(new Group(), 300, 200);
		Stage stage = new Stage();
		stage.setScene(scene);
		stage.setTitle("no-args constructor");
		stage.show();
		//Platform.setImplicitExit(false);
	}
	
	//在Launcher进程中运行,其余Constructor/start/stop在Application进程中运行
	@Override
	public void init() {
		try {
			String name = Thread.currentThread().getName();
			System.out.println("init : " + name);

			//书中描述在init方法中禁止创建Stage和Scene实例,实际测试只有调用Stage时才会报错
			Scene scene = new Scene(new Group(), 300, 200);
            //
            //stageInClass.setScene(scene);
			Stage stage = new Stage();
			stage.setScene(scene);
			//stage.show();

			//在init或Constructor方法中调用exit方法后,会不调用stop方法
			//Platform.exit();
		} catch (Exception e) {
			System.out.println("error in init method :");
			System.out.println(e.getMessage());
		}
	}

	@Override
	public void start(Stage primaryStage) throws Exception {
		// TODO Auto-generated method stub
		String name = Thread.currentThread().getName();
		System.out.println("start : " + name);
		
		Scene scene = new Scene(new Group(), 300, 400);
		primaryStage.setScene(scene);
		primaryStage.setTitle("start method");
		primaryStage.show();

		//Platform.setImplicitExit(false);
		//Platform.exit();
		//System.out.println("Platfrom.exit()");
	}
	
	@Override
	public void stop() {
		String name = Thread.currentThread().getName();
		System.out.println("stop : " + name);
	}

	private Stage stageInClass;
	/**
	 * @param args
	 */
	/*public static void main(String[] args) {
		// TODO Auto-generated method stub
		String name = Thread.currentThread().getName();
		System.out.println("main : " + name);
		Application.launch(FXLifeCycleApp.class, args);
	}*/
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值