スクリプトはコンパイルされる?
JavaFX Scriptは、インタープリタのスクリプト言語でした。が、プロジェクトを作成し、実際にビルドしてプログラムの動作を確認してから、プロジェクトのフォルダ内を見てみると、「dist」というフォルダが作成され、その中にJarファイルが作成されていることに気が付くはずです。そう、1.0 Preview版では、スクリプトはJavaのクラスファイルにコンパイルされているのです。
1.0ではJavaFX Scriptのコンパイラが採用されており、NetBeansではこれを使ってスクリプトはJavaのクラスファイルへとコンパイルされるようになっています。このため、作成されたJarファイルをダブルクリックするだけでスクリプトを実行できるようになりました。スクリプトの「その場で書いていつでも修正できる」という手軽さからすれば、インタープリタの方が便利ですが、作成したプログラムを実際に利用することを考えるなら、コンパイラの採用は十分うなずけるものでしょう。ただし、そのおかげで、いろいろと仕様が変更されてしまいました。
JavaFX Script 0.7からの変更点
これまで0.7として公開されていたJavaFX Scriptは、インタープリタでした。が、実はこれと平行して、既にJavaFX Scriptのコンパイラも開発が行われていたのです。このコンパイラは、インタープリタとはかなり異なる言語仕様になっていました。今回、1.0 Previewで、このコンパイラが標準搭載されたことにより、言語仕様そのものもインタープリタ版からコンパイラ版に変わってしまった、というわけです。要するに、1.0 Previewでのさまざまな仕様変更は、「インタープリタからコンパイラへ」と変わったために起こったものなのです。
Swingベース・アプリケーションの基本形
では、実際にスクリプトを挙げながら、1.0 Preview版の基本形を見ていくことにしましょう。まず、ごく単純に「Labelを使ってテキストを表示するウインドウ」のアプリケーションを考えてみましょう。
import javafx.ui.*; Frame { title:"Title" width:200 height:100 visible:true content: Label { text: "JavaFX!" } }
これは、従来の0.7で記述した簡単なサンプルです。JavaFXは、SwingをベースにしてGUIを構築します。その土台には、JFrameを継承した「Frame」というクラスが用意されており、これを使ってアプリケーションのウインドウを作成していくのが基本でした。
1.0では、土台となるウインドウ用のクラスが変わっています。「SwingFrame」という、Swingを利用したフレームのためのクラスが用意されており、これを利用するようになっているのです。
package fxsample; import javafx.ext.swing.*; SwingFrame { title: "Title" width: 200 height: 200 visible: true content: Label { text: "new JavaFX!" } }
これで、ほぼ同様の実行結果になります。見れば分かるように、使用しているクラスがFrameから「SwingFrame」になっていますね。1.0でもFrame
クラスはありますが、これはSwingコンポーネントを利用するものではなくなっています。
アプリケーションのベースとなる2つのウィンドウ
1.0では、アプリケーションの土台となるウインドウ作成用クラスは「Frame」と「SwingFrame」の2つが用意されています。SwingFrameが、Swingコンポーネントを使ったGUI構築のためのフレームクラスです。Frameは、「Stage」と呼ばれるグラフィック表示用のフレームクラスになります(これは後述します)。
Swingコンポーネントの利用
まずは、Swingコンポーネントの利用に目を向けましょう。Swingでは、SwingFrameというクラスを利用しますが、これには「javafx.ext.swing」というパッケージに用意されています。1.0では、JavaFX関係のクラスのパッケージがかなり変わっています。0.7では、GUI関連のクラスは、すべてjavafx.uiパッケージに収められていましたが、SwingのGUI関係に関しては、javafx.ext.swingに移されています。
FrameからSwingFrameへとクラスが変わりましたが、基本的な使い方についてはそれほど大きな違いはありません。contentにコンポーネントを組み込んでいくという点は同じです。複数のコンポーネントをレイアウトして配置する場合は、レイアウトマネージャ組み込み済みのパネル・クラスを組み込んで利用します。
package fxsample; import javafx.ext.swing.*; SwingFrame { title: "Title" width: 200 height: 100 visible: true content: BorderPanel { top: Label { text: "JavaFX!" } center: TextField {} bottom: Button { text: "Click" } } }
例えば、これはBorderPanelを使い、Label、TextField、Buttonといったコンポーネントを配置した例です。ここでは、SwingFrameのcontentにBorderPanelを組み込み、そのtop、center、bottomにそれぞれコンポーネントを配置しています。このあたりは、0.7でのFrameの利用とほとんど違いないことが分かりますね。