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では描画要素のツリー構造のことをシーングラフと呼びます。シーングラフを保持しているクラスなので、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);
}
}