JavaFX アプリケーションの基本メソッドとスレッド

最小限の JavaFX アプリケーション」では、非常に単純な JavaFX の骨組みを示しました。 ここでは少し発展させて、仕組みを掘り下げていきます。

JavaFX プログラム実行の流れ

JavaFX アプリケーションは javafx.application.Application クラスの派生クラスとして作ります。

実行を開始して main メソッドがあれば、main が呼ばれます。 その中で Application クラスの launch メソッドを呼びます。

次に init メソッドが (もしあれば) 呼び出されます。これをオーバライドするのは必須ではありません。

次に start メソッドが呼ばれます。start メソッドの実装は必須です。

start メソッドは引数として、プライマリステージのインスタンスを受けとります。 プライマリステージはプログラムのメインウィンドウを表していて、これの show() メソッドを呼ぶことでウィンドウが表示されます。

アプリケーションが終了するのを待ちます。

アプリケーションが終了処理に入ったら stop メソッドが (もしあれば) 呼び出されます。クリーンアップなどが必要な場合はここに処理を書きます。

実際に動かして確認しよう

では、main init start stop が実際に呼び出されることを確認します。 ついでにスレッドの ID と名前も表示します。

package com.keicode.java.testapps;

import javafx.application.Application;
import javafx.stage.Stage;

public class App1 extends Application {

	public static void main(String[] args) {
		showThreadInfo("main");
		launch(args);
	}

	@Override
	public void init() throws Exception {
		showThreadInfo("init");
	}

	@Override
	public void start(Stage primaryStage) throws Exception {
		showThreadInfo("start");
		primaryStage.setTitle("JavaFX App1");
		primaryStage.show();
	}

	@Override
	public void stop() throws Exception {
		showThreadInfo("stop");
	}

	static void showThreadInfo(String label) {
		Thread t = Thread.currentThread();
		String s = label + ":[" + t.getId() + "] " + t.getName();
		System.out.println(s);
	}
}

実行すると次のような空のウィンドウが表示されます。

と、同時にコンソールに次のようにスレッドの情報が表示されます。

main:[1] main
init:[13] JavaFX-Launcher
start:[12] JavaFX Application Thread
stop:[12] JavaFX Application Thread # ウィンドウを閉じた後

確かに main init start stop というメソッドは順番に呼び出されいることが確認できたと思います。

ただし、スレッドは何種類か登場しています。

基本的な処理とスレッディング

一般的に GUI コンポーネントを持つアプリケーション開発においては、 プラットフォームによって、ウィンドウメッセージを処理できるスレッドが決まっている場合が多いため、 どのスレッドでどんな処理ができるか、ということに少し注意を払う必要があります

JavaFX では JavaFX アプリケーションスレッドというのがイベント処理や GUI コンポーネントを扱うスレッドです。

上で見たように、スレッドは main はメインスレッド上で、 init は JavaFX ランチャースレッド上で、 startstop は JavaFX アプリケーションスレッド上で実行されていることがわかります。

つまり、 init() メソッドは JavaFX アプリケーションスレッドで実行されていないので、 init() メソッド内で Stage や、後述の Scene オブジェクト等を操作することはできません。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門