JavaFX 1.0 正式リリース

こちらで知ったのだが,つい先頃,JavaFX の1.0が正式にリリースされた.NetBeans 6.5で使えるようになっている.めでたい.

が!なんと驚くべきことに,ベータリリースと文法やらクラス階層やらが大きく変わっている.なんなんだ...というわけで,これまで書いたプログラムが全然動かん.0.7から1.0への際とは違って,表面的な違いのようにも見えるのでそれほど大変ではなさそうだが,先日書いたデモプログラムは,記憶が新しいうちに書き直しておかないと,今後動かなくなってしまいそうだ.

変更点のメモ

気がついた部分だけ.

attribute がvar に
これまではクラスのメンバ変数はattributeキーワードで宣言していたのだが,これがvarキーワードに統一された.
overrideキーワードが必要に
親クラスのメソッドをoverrideする際には,override 修飾子で明示しなければならない.
ファイルのトップレベルにstatementが書けない
これまでは,トップレベルに直接statementを書いておくと,そのファイルを直接実行したときに実行されていたのだが,これがゆるされなくなった.runという関数を作り,そのなかに書かなければならない.(12/6追記: skrbさんからのコメントで,Mainファイルの場合はトップレベルにstatementが直接書けると教えていただいた.run関数が必要なのはMain以外のファイルの場合のみ.)
Frameがない
これまではFrameとSwingFrameのどちらかがウィンドウを作る際に必要だったのだが,両方ともなくなっている.びっくりだ.Stage を直接使うことになったらしい.
javafx.async 追加
非同期処理のためのパッケージ.0.7にあったらしいが,1.0ベータにはなかった.

  1. パッケージ変更
    1. javafx.scene.geometry -> javafx.scene.shape
    2. javafx.input -> javafx.scene.input
    3. javafx.scene.Font -> javafx.scene.text.Font
    4. FontStyle -> FontWeight, などに.
    5. java.application パッケージがなくなった.
    6. javafx.ext.swing 内のクラスは全部頭にSwingがつくように.

床屋

先日書いた床屋プログラムを正式版で動くようにしたもの.一番変わっているのは,一番runメソッドの部分.他は機械的な書き換えで大丈夫.

こころなしか,処理系の動作が軽くなったような気がする.処理系も改良されているのだろう.

package mytest;

import javafx.scene.*;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import javafx.scene.input.*;
import javafx.scene.transform.*;
import javafx.scene.text.*;
import javafx.ext.swing.*;
import java.lang.*;
import javafx.animation.Timeline;
import javafx.animation.KeyFrame;
import javafx.animation.Interpolator;
import javafx.stage.*;

/**
 * @author nakada
 */

public class Barber extends CustomNode {
    var x: Integer;
    var y: Integer;

    var len: Number;
    var width: Number;
    var baseColor1: Color;
    var baseColor2: Color;
    var offset: Number = 0.0;

    var animate = Timeline {
        repeatCount: Timeline.INDEFINITE
        keyFrames: [
           at (0s) {offset => 0.0},
           at (1s) {offset => 30.0 tween Interpolator.LINEAR}
        ]
    };
    
    function start() {
        animate.play();
    }
    
    override function create(): Node {
        return Rectangle {
            x: bind x
            y: bind y
            width: bind width
            height: bind len
            arcWidth: bind width;
            arcHeight: bind width;
            fill: bind LinearGradient {
                    startX: offset
                    startY: offset
                    endX: 30.0 + offset
                    endY: 30.0 + offset
                    proportional: false
                    cycleMethod: CycleMethod.REPEAT;
                    stops: [
                        Stop {
                            offset: 0.0
                            color: Color.WHITE },
                        Stop {
                            offset: 0.25
                            color: baseColor1 },
                        Stop {
                            offset: 0.5
                            color: Color.WHITE },
                        Stop {
                            offset: 0.75
                            color: baseColor2 },
                        Stop {
                            offset: 1.0
                            color: Color.WHITE }
                    ]
                };
        }
    }
}


function run() {
  var s = Stage {
        scene: Scene {content: []}
        visible: true
        width: 230
        height: 500
  }
  var barber = Barber {
    x: 100
    y: 100
    len: 300
    width:  30
    baseColor1: Color.RED
    baseColor2: Color.BLUE
  };
  insert barber into
  s.scene.content;
  barber.start();
}