JavaFX2.0入門1 Hello JavaFX!

JavaFXのインストールを済ませた所で、早速JavaFXを利用したコードを書いてみます。
まず手始めとしてウィンドウの中央に"Hello JavaFX!"という文字列を表示する簡単なプログラムから。


JavaFXアプリケーションを作成するには、Applicationクラスを継承したクラスを作成してstartメソッドをオーバーライドする必要があります。*1
startメソッドには引数としてウィンドウの外枠部分となるStageオブジェクトが渡されますが、このままだとウィンドウ内には何も表示されません。なので、シーングラフ(ウィンドウ内で描画する要素を木構造で表した物)を持つSceneオブジェクトを生成して、このSceneオブジェクトを生成してStageオブジェクトに設定してあげる必要があります。


今回は、シーングラフのルートとして、ラベルを中央に表示するためのBorderPaneを生成し、そのcenterに"Hello JavaFX!"と表示するラベルを設定しました。
シーングラフを画像にするとこんな感じです。


あとは、mainメソッド内でlaunchメソッドを呼び出すようにすればこのアプリケーションは完成です。
アプリケーションを起動すると、mainメソッドから呼び出されたlaunchメソッドが以下の順番でApplicationクラスのメソッドを呼び出します。

  1. コンストラクタ
  2. initメソッド
  3. startメソッド

なお、launchメソッドに渡した引数は、ApplicationクラスのgetParametersメソッドで取り出すことが出来るようです。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start( Stage primaryStage ) {
        BorderPane borderPane = new BorderPane();
        borderPane.setCenter( new Label( "Hello JavaFX!" ) );
        
        Scene scene = new Scene( borderPane, 200, 150 );
        primaryStage.setScene( scene );

        //ウィンドウを表示
        primaryStage.show();
    }
}



ちなみにSwingで同じ内容のプログラムを書くとこうなります。
AWT/SwingではContainerの属性であったレイアウトが、JavaFXではそれぞれ独立した部品になったのが大きなポイントでしょうか。 また、JavaFXではSwingのJPanelに相当する部品も無いみたいです。

import java.awt.BorderLayout;
import javax.swing.*;

public class Main{

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {

            public void run() {
                Main thisClass = new Main();
                thisClass.start();
            }
        });
    }

    public void start() {
        JFrame frame = new JFrame();
        frame.setSize( 200, 150 );
        JPanel panel = new JPanel( new BorderLayout() );
        panel.add(  new JLabel( "Hello JavaFX!", SwingConstants.CENTER ), BorderLayout.CENTER );
        
        frame.add( panel );
        frame.setVisible( true );
    }
}

*1:他にApplicationクラスはinitメソッドとstopメソッドがありますが、必要がなければオーバーライドしなくてもかまいません。