では、サンプルのソースコードを以下に示す。

リスト1: examples/helloworld/HelloWorld.fx

// (1) パッケージの指定
package examples.helloworld;

// (2) import文を用いて他パッケージ内のクラスを参照
import javafx.ui.*;
import javax.swing.JOptionPane;

// (3) javafx.ui.Frameクラスのインスタンスを生成
var f = Frame {

    // (4) タイトル、幅、高さの指定
    title: "Hello, World", width: 200, height: 100

    // (5) 自身のインスタンスを変数frameに入れておく
    var: frame

    // (6) フレームの内容
    content: Button {
        text: "クリック!"           // ボタンのテキスト

        // (7) ボタンクリック時のアクションを指定
        action: operation() {
            // (8)"Hello, JavaFX"というメッセージダイアログを表示
            JOptionPane.showMessageDialog(
                (<<java.awt.Frame>>)frame.getWindow(), "Hello, JavaFX");
        }
    }
    // 画面中央に表示
    centerOnScreen: true, visible: true
};

ソースコード内で番号を振った部分がポイントとなる。一つ一つ見ていくとしよう。

(1) パッケージの指定は、Java言語と同じくpackageキーワードを用いて行う。

(2) Javaと同じくimport文を用いて他のパッケージに属するクラスをインポートしている。Javaのクラスを直接importできるのも興味深い。ちなみに、同一パッケージ内のクラス(JavaFX Script、Java問わず)であれば、インポートせずに使用できるのもJavaと同様。

(3) javafx.ui.Frameクラスのインスタンスを生成し、変数fに代入している。このことからわかるとおり、変数の宣言はvarキーワードを用いて行う(変数の宣言方法については後述)。これは、アプリケーションのメインウィンドウとなるクラスだ。以前のハウツー記事でも触れているが、Frameとそれに続く中括弧内で行っている処理は、以下のコードと等価だ。

// 引数なしのコンストラクタを用いて
// インスタンスを生成し、属性に値をセット
var f = new Frame();
f.title = "Hello, World";
f.width = 200;
……

このコードと比べると、リスト1に示したコードは非常に解りやすい。JavaFXではリスト1のようなコードを宣言的な記述と呼んでいる。

(4) 属性に値を指定し、タイトル、幅、高さを設定している。属性(attribute)は、インスタンスの状態を表すもので、Javaにおけるプロパティ(setter/getter)に近い。このように宣言的に属性値を設定する場合、改行文字もしくはカンマが区切り文字となる。

(5) インスタンスの属性指定を宣言的に行う場合、そのインスタンス自身を変数として参照したい場合がある。ここではFrameのインスタンスだ。そういう場合、var: 属性名という記述を行うことにより、自身のインスタンスを「属性名」で指定した変数に代入することができる。ここでframeに代入されたインスタンスは(8)で触れるコードで使用される。

(6) フレームの内容を表す属性contentに、Buttonクラスのインスタンスを代入している。Buttonのインスタンスも宣言的に生成されている。

(7) ボタンのaction属性にオペレーション(後述)を指定することで、ボタンクリック時のアクションを指定している。

(8) ボタンのアクションとしては、javax.swing.JOptionPaneクラスのメソッドを用いてダイアログを表示している。メソッドの第一引数に指定しているのはダイアログのオーナーだが、この部分の記述には注意が必要だ。Javaでは、クラスの完全修飾名(パッケージ名.クラス名)は直接ソースコード中に記述できるが、JavaFX Scriptでは、パッケージの区切り文字「.」を識別子に使用できない。「<< >>」は、そうした「識別子に利用できない」文字列を識別子として扱うための汎用的な構文である(この例では「java.awt.Frame」)。この機能により、「if」「for」といったJavaFXでの予約語、Javaクラスの完全修飾名、空白を含む文字列、format as演算子で使用するフォーマット指定子(後述)といったもの全てをプログラムの識別子として用いることができる。