JavaFXの2回目となる今回は、JavaFXのアプリケーションを作成しながら、JavaFXの基本的な部分を見ていきましょう。前回はGUIフレームワークの基本的な部分を解説しました。今回はそれを踏まえて、JavaFXでそれらを表した場合について紹介していきます。

基本的な構成

 JavaFXのアプリケーションはjavafx.application.Applicationクラスのサブクラスとして定義します。

 Applicationクラスは抽象クラスで、startメソッドをオーバーロードする必要があります。このstartメソッドで、GUIの初期設定を行います。

 JavaFXではウインドウを表すクラスはjavafx.stage.Stageクラスです。また、ルートコンテナを保持するために使用するのが、javafx.scene.Sceneクラスです。そして、StageオブジェクトはSceneオブジェクトを保持します。これをクラス図で表したのが図1です。

図1●JavaFXの基本構成
図1●JavaFXの基本構成

 図1ではコンテナというクラスがあるように擬似的に記述しています。実際にどのようなコンテナがあるかは後ほど解説します。

 このコンテナ以下に、前回紹介した描画要素のツリー構造を追加していきます。なお、JavaFXでは描画要素のツリー構造のことをシーングラフと呼びます。シーングラフを保持しているクラスなので、Sceneクラスなのです。

 シーングラフはもともとは3D CGで使用されていた言葉です。3D CGでも、描画するオブジェクトをツリー構造で表すことがあり、それをシーングラフと呼んでいます。

 ルートコンテナから始まるツリー構造、つまりシーングラフは、前回紹介したようにコンポジットパターンを使用して記述できます。

 しかし、XMLを使用して記述することを強くお勧めします。前回紹介したように、JavaFXではFXMLを使用してツリー構造を記述します。FXMLファイルをロードするために使用するのが、javafx.fxml.FXMLLoaderクラスです。

 さて、ここまでのところで、サンプルアプリケーションを作ってみましょう。ここではシンプルにHello, World!と表示するだけのアプリケーションです。クラス名はHelloAppにしましょう。リスト1にHelloAppクラスを示しました。

リスト1●HelloAppクラス

import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloApp extends Application {
    @Override
    public void start(Stage stage) throws IOException {
        // FXMLファイルをロードし、シーングラフを生成する
        StackPane root = FXMLLoader.load(getClass().getResource("hello.fxml"));

        // Sceneオブジェクトを生成し、ルートコンテナを設定する
        Scene scene = new Scene(root);
        
        // Stageオブジェクトに対し、タイトルを設定
        stage.setTitle("Hello, World!");
        // Stageオブジェクトに対し、Sceneオブジェクトを設定
        stage.setScene(scene);
        // Stageオブジェクトを表示
        stage.show();
    }

    public static void main(String... args) {
        // JavaFX Application Threadを開始
        launch(args);
    }    
}