ついにベールを脱いだJavaFX

第1回 JavaFXの概要と基本

この記事を読むのに必要な時間:およそ 7 分

JavaFX Scriptの特徴

それでは,JavaFXアプリケーションを構築のためのスクリプト言語であるJavaFX Scriptについて見ていくことにしましょう。JavaFX Scriptには以下のような特徴があります。

  • オブジェクト指向
  • 宣言的文法
  • 静的型付け
  • バインド
  • 置換トリガ
  • 時間間隔のサポート

オブジェクト指向は当たり前のように使われているので,ここでは説明を省略します。その他の特徴について以下に説明します。

宣言的文法

前述したように,宣言的文法は構造的データを効率よく表すために使用されます。また,宣言的文法はオブジェクトの生成,初期化で使用されます。JavaFX Scriptはオブジェクトの生成を,以下のようにクラス名に続けた波括弧で行います。

リスト1

Stage { }

ここではStageクラスのオブジェクトを生成しています。

Javaではクラスはフィールドとメソッドを持ちますが,JavaFX Scriptではアトリビュートと関数を持ちます。名前は違いますが,行うことは同じです。アトリビュートの初期化はオブジェクトを生成する時に行うことができます。アトリビュートの初期化は,並括弧の中にアトリビュート名とその値をコロンでつなげて行います。

リスト2

Stage {
    title: "Hello"
    width:  160
    height: 80
}

この例ではStageオブジェクトのtitleアトリビュートに"Hello",widthアトリビュートに160,heightアトリビュートに80を代入しています。このような表記が宣言的文法なのです。この表記を見ると,HTMLで使用されるCSSや,JavaScriptのオブジェクトリテラルを連想させますね。

ちなみに,Javaのコンストラクタと違い,JavaFX Scriptではアトリビュートの初期化に順序はありません。この例であれば,titleアトリビュートをwidthアトリビュートの後に初期化しても大丈夫です。また,すべてのアトリビュートを初期化する必要はありません。Javaとは異なり関数型が存在するため,関数型のアトリビュートに関数を代入することもできます。

リスト3

Stage {
    title: "Hello"
    width:  160
    height: 80
        
    onClose: function() {
        System.exit(0);
    }
}

この例ではonCloseアトリビュートにSystem.exit(0);をコールする関数を代入しています。もちろん,オブジェクトの初期化を入れ子にすることも可能です。

リスト4

Stage {
    title: "Hello"
    width: 160
    height: 80
 
    onClose: function() {
        System.exit(0);
    }
 
    scene: Scene {
        content: SwingLabel {
            font: Font {
                size: 24
            }
            text: "Hello, World!"
        }
    }
}

この例ではStageオブジェクトのsceneアトリビュートにSceneオブジェクトを生成して代入しています。また,SceneオブジェクトのcontentアトリビュートにはSwingLabelオブジェクトを生成して代入し,さらにSwingLabelオブジェクトのfontアトリビュートにFontオブジェクトを生成して代入しています。この例からわかるように,ツリー構造をそのままスクリプトとして表すことができます。

同じ処理をJavaで行ってみましょう。

リスト5

public class Hello {
    public Hello() {
        JFrame frame = new JFrame("Hello");
 
        frame.setSize(160, 80);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        JLabel label = new JLabel("Hello, World!");
        Font font = new Font(Font.SANS_SERIF, Font.PLAIN, 24);
        label.setFont(font);
 
        frame.add(label);
 
        frame.setVisible(true);
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Hello();
            }
        });
    }
}

Javaではまずオブジェクトを生成し,必要に応じてプロパティをセッターメソッドなどでセットしていくという形式になります。つまり,手続き的に構造を作り上げていくわけです。どちらが優れているという比較は意味をなしませんが,GUIのようにツリーで表される構造的な情報を表すには,宣言的文法の方が簡潔に記述できるのです。

著者プロフィール

櫻庭祐一(さくらばゆういち)

横河電機に勤務するかたわらJava in the Boxにて新しい技術を追い続けています。JavaOneは今年で11年目。名実共にJavaOneフリークと化しています。