読者です 読者をやめる 読者になる 読者になる

基本的構造

JavaFX

JavaFX 2.0 のプログラムは Application クラスのサブクラスとして実装します。

基本的には Application クラスの start メソッドをオーバーライドし、main メソッドで Application.launch メソッドをコールするようにします。

Application.launch メソッドの第 1 引数は Application クラスのサブクラスの Class クラスを指定します。

public class Test extends Application {
    @Override
    public void start(Stage stage) {
        // シーングラフを構築する
    }

    public static void main(String[] args) {
        Application.launch(Test.class, null);
    }
}

JavaFX では UI をシーングラフというツリー構造で表します。Swing/AWT などでも明示的ではありませんが、UI はツリー構造になります。それを JavaFX は明示的にシーングラフと呼んでいるわけです。

もともとシーングラフという言葉は 3D CG で使われていた言葉です。描画する要素だけでなく、ライティングやカメラも含めてツリー構造 (グラフ構造) で表したものがシーングラフというわけです。シーングラフを採用している代表的な CG ライブラリとして、Java 3D があります。

JavaFX では Swing/AWT とは異なり、コンポーネントだけでなく、四角や丸など Java 2D 的な要素も含みます。こういう要素も一緒くたに扱うので、JavaFX ではシーングラフと呼んでいるのではないでしょうか。

ちなみに、JavaFX ではボタンなどを UI コントロール、四角や丸をシェイプと呼びますが、いずれも Node クラスのサブクラスとして表されます。

このシーングラフを構築するのが start メソッドです。

引数で渡される Stage クラスが、Swing でいうところの JFrame クラスに相当します。

そして、シーングラフのルートになるのが Scene クラスです。

Scene クラスは 1 つのコンテナとなるクラスを子要素として取ります。後はこのコンテナにノードを貼りつけていくわけです。

たとえば、Hello World は、Scene オブジェクトの下にコンテナ (ここでは Group を使います) を貼り、そこに Label を貼ることで実現します。

public class Test extends Application {
    @Override
    public void start(Stage stage) {
        // コンテナ
        Group container = new Group();
 
        // コンテナを指定して、シーングラフのルート要素を生成する
        Scene scene = new Scene(container, 100, 20);
        
        // ステージにコンテナを貼る
        stage.setScene(scene);
 
        // ラベルを生成しコンテナに貼る
        Label label = new Label("Hello, World!");
        container.getChildren().add(label);
 
        // 表示
        stage.setVisible(true);
    }

    public static void main(String[] args) {
        Application.launch(Test.class, null);
    }
}

複雑な UI であっても、この構造は同じです。

なお、コンテナになるクラスも Node クラスのサブクラスなので、コンテナにコンテナを貼ることも可能です。こうすることで、複雑なツリー (シーングラフ) を作り上げます。

ついでですが、start メソッドですべてのシーングラフを作成する必要はありません。後からシーングラフに追加していくことや、シーングラフからノードを削除することも可能です。

ちなみに、Application クラスでは start メソッドの他に、init メソッド、stop メソッド、destroy メソッドがあります。このメソッドを見ると思い出すのが、Applet クラスです。

JavaFX のアプリケーションはデスクトップアプリケーション以外に、アプレット、Java Web Start としても実行することができます。しかも、どれで実行してもソースは変更する必要はありません。そこらへんが、Application クラスと Applet クラスが似ている理由なのかもしれません。