基本的構造
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 クラスが似ている理由なのかもしれません。