JavaFX2.0 は 2011 年下半期リリース予定
2010年 の JavaOne で 2011 年下半期リリースと発表された JavaFX 2.0。NetBeans プラグインもでてたので ちょっとだけお試し
http://javafx.com/
ダウンロード
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 は開発対象から外され、通常の Java の API を拡充していく流れとなります。複雑な GUI 要素をプレーンな Java で記述するのは厳しいので、現時点では Groovy などの LL で GUI 要素構築が吉でしょうか。