JavaFX2.0 を試してみませんか?

JavaFX2.0 は 2011 年下半期リリース予定


2010年 の JavaOne で 2011 年下半期リリースと発表された JavaFX 2.0。NetBeans プラグインもでてたので ちょっとだけお試し
http://javafx.com/

ダウンロード

http://javafx.com/downloads/

NetBeans プラグイン使えば 必要なランタイムは勝手に入ります。NetBeans で使うなら JavaFX 2.0 Beta Plugin for NetBeans IDE 7.0 (build 30) だけ落とせばよいです。
ダウンロードには Oracle Technology Network のアカウントが必要となっています。
現在は Windows 版のみが公開されています。

プラグインの導入とプロジェクトの作成

NetBeans IDE 7.0 は更新しておかないとプラグインの適用でエラーとなります。[ヘルプ] - [更新の有無の確認] で最新化しておきましょう。最新化したあとは [ツール] - [プラグイン] でダウンロードしたプラグインの nbm ファイル を全て指定してプラグインをインストールします。
プラグインインストールすると、JavaFX プロジェクトが選択できるようになります。

ランタイムはホームディレクトリの以下に格納されたものが参照されます。
.netbeans\7.0\lib\javafx2-win\lib\jfxrt.jar

最初のサンプル

クライアントアプリケーションは、javafx.application.Application を継承し、start() に必要な処理を記載します。

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class JavaFXSample extends Application {

    public static void main(String[] args) {
        Application.launch(JavaFXSample.class, args);
    }
    
    @Override public void start(Stage primaryStage) {
        
        Group root = new Group();
        Scene scene = new Scene(root, 200, 200, Color.BLACK);
        
        primaryStage.setScene(scene);
        primaryStage.setTitle("JavaFX");
        primaryStage.setVisible(true);
    }
}

Stage が Swing の Frame のようなものにあたります。そして、Group が Panel のようなイメージでしょうか。Group に GUI 要素を追加し、Stage に登録という流れとなります。
実行すると以下のようになります。

Group は木構造で要素を管理する

ルートとなる Group に子要素を追加してみます。

    @Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        Scene scene = new Scene(root, 600, 400, Color.BLACK);
        root.getChildren().add(circleGroup());

        primaryStage.setScene(scene);
        primaryStage.setTitle("JavaFX");
        primaryStage.setVisible(true);
    }
    
    private Group circleGroup() {
        Group group = new Group();
        Circle circle = new Circle(50, Color.DARKGRAY);
        group.setEffect(new BoxBlur(10, 10, 3));
        group.getChildren().add(circle);
        return group;
    }

circleGroup() にて Circle を追加した Group を ルート Group の子要素として登録しています。

root.getChildren().add(circleGroup());

実行すると以下のようになります。

フレームを管理する Timeline

先ほどの Circle を動かしてみます。GUI 要素を動作させるには Timeline というオブジェクトにフレームを登録して play()
メソッドを呼びます。

    private void playTimeline(Group circleGroup) {
        Timeline timeline = new Timeline();
        for (Node circle: circleGroup.getChildren()) {
            timeline.getKeyFrames().addAll(
                new KeyFrame(Duration.ZERO,
                    new KeyValue<Number>(circle.translateXProperty(), random() * 600),
                    new KeyValue<Number>(circle.translateYProperty(), random() * 400)),
                new KeyFrame(new Duration(10000),
                    new KeyValue<Number>(circle.translateXProperty(), random() * 600),
                    new KeyValue<Number>(circle.translateYProperty(), random() * 400)) );
        }
        timeline.play();
    }

Circle を 30個ばかり用意してうにうに 動かします。


コードは以下です。

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.effect.BoxBlur;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;
import static java.lang.Math.random;
        
public class JavaFXSample extends Application {

    public static void main(String[] args) {
        Application.launch(JavaFXSample.class, args);
    }
    
    @Override public void start(Stage primaryStage) {
        
        Group root = new Group();
        Scene scene = new Scene(root, 600, 400, Color.BLACK);
        
        Group circles = circleGroup();
        root.getChildren().add(circles);
        playTimeline(circles);

        primaryStage.setScene(scene);
        primaryStage.setTitle("JavaFX");
        primaryStage.setVisible(true);
        
    }
    
    private Group circleGroup() {
        Group group = new Group();

        for (int i = 0; i < 30; i++) {
            Circle circle = new Circle(50, Color.DARKGRAY);
            group.setEffect(new BoxBlur(10, 10, 3));
            group.getChildren().add(circle);
        }
        return group;
    }
    
    private void playTimeline(Group circleGroup) {
        Timeline timeline = new Timeline();
        for (Node circle: circleGroup.getChildren()) {
            timeline.getKeyFrames().addAll(
                new KeyFrame(Duration.ZERO,
                    new KeyValue<Number>(circle.translateXProperty(), random() * 600),
                    new KeyValue<Number>(circle.translateYProperty(), random() * 400)),
                new KeyFrame(new Duration(10000),
                    new KeyValue<Number>(circle.translateXProperty(), random() * 600),
                    new KeyValue<Number>(circle.translateYProperty(), random() * 400)) );
        }
        timeline.play();
    }
}


以上、本家の Getting Started の簡易版でした。

JavaFX Script → Groovy

JavaFX2.0 では、JavaFX1.0 にあった JavaFX Script は開発対象から外され、通常の JavaAPI を拡充していく流れとなります。複雑な GUI 要素をプレーンな Java で記述するのは厳しいので、現時点では Groovy などの LL で GUI 要素構築が吉でしょうか。