ついにベールを脱いだJavaFX

第14回補遺:JavaFX Scriptマイグレーションガイド

JavaFX Scriptはインタープリタ版、Preview SDK、JavaFX 1.0、Java FX 1.1と変遷を遂げてきました。そして、そのつど文法やAPIが変更されてきました。

そこで、本連載の補遺として、その主な変更点をまとめてみます。主に文法の差異をまとめ、APIに関しては大きな変化のみを取りあげています。

ここで、いつ変更されたかわるように、以下のように記号を使用します。

  • (I) ... インタープリタ版
  • (P) ... Preview SDK
  • (1.0) ... JavaFX 1.0
  • (1.1) ... JavaFX 1.1

たとえば、タイトルに (I)/(P)と記述してあれば、インタープリタ版とPreview SDKが最新のJavaFX 1.1とは異なることを示しています。また、リストのタイトルに(I)と記述してあれば、インタープリタ版での記述法を示しています。

目次

文法編

データ型と変数

数値型の変更 (I)/(P)/(1.0)

インタープリタ版では数値型はInteger、Numberで表されていました。IntegerはJavaのint、long、BigIntegerクラスに対応し、Numberはdoubleに対応していました。

JavaFX 1.0でIntegerはintに対応するように変更されました。また、JavaFX 1.1でNumberがfloatに対応するように変更されました。

さらに、JavaFX 1.1ではInteger、Number以外に以下の数値型が提供されています。

  • Byte
  • Short
  • Long
  • Float
  • Double

それぞれ、Javaのbyte、short、long、float、doubleに対応しています。

時間間隔 (I)

時間間隔を表すDuration型が導入され、時間間隔を表すことができます。

リスト1 時間間隔 (P)/(1.0)/(1.1)
var u: Duration = 2h; // 2時間
var v: Duration = 30m; // 30分
var x: Duration = 1.0s; // 1秒
var y: Duration = 10ms; // 10ミリ秒

複数の要素からなる変数 (I)

インタープリタ版では変数が複数の要素を持つかどうかを示すために?、+、*を使用して変数を定義することができました。Preview SDKからはこれらのキーワードはサポートされなくなり、複数の要素で表される場合はすべてシーケンスとして定義します。

リスト2 複数の要素からなる変数 (I)
var x? = [0..10]; // nullの可能性がある
var y+ = 5; // 変数の個数が1個以上
var z* = [2..5];  // 変数の個数が0個以上
リスト3 複数の要素からなる変数 (P)/(1.0)/(1.1)
var x: Integer[] = [0..10];
var y: Integer[] = 5;
var z: Integer[] = [2..5];

定数 (I)/(P)

JavaFX 1.0で一度だけ代入することができるdefが定義されました。

リスト4 defキーワード (1.0)/(1.1)
def x = 10;
x = 20; // NG 代入はできない
 
def line = Line {
    startX: 0.0 startY: 0.0
    endX: 10.0 endY: 20.0
};
line.startX = 2.0; // これはOK

定数の代入 (I)

インタープリタ版では定数の型の記述を省略できましたが、Preview SDKからは型を明示する必要があります。

リスト5 定数の代入 (I)
Rect {
    width: 200
    height: 1000
    fill: red
};
リスト6 定数の代入 (P)/(1.0)/(1.1)
Rectangle {
    width: 200
    height: 1000
    fill: Color.RED
};

複数行に渡る文字列 (I)

インタープリタ版では複数行に渡るリテラル文字列が許されていましたが、Preview SDKから使用できなくなりました。複数行に渡る文字列を扱う場合、文字列中に改行を示す\nを含めます。

リスト7 複数行の文字列 (I)
var text = "This
is
a multiline
string.";
リスト8 複数行の文字列 (P)/(1.0)/(1.1)
var text = "This\nis\na multiline\nstring.";

文字列への式の埋め込み (I)

インタープリタ版ではダブルクオテーションで囲まれた文字列のみ式の埋め込みが可能でした。Preview SDKからはダブルクオテーションだけでなく、シングルクオテーションでも式の埋め込みが可能です。

リスト9 式の埋め込み (I)
var x = 10;
System.out.println("x = {x}");   // これはOK
System.out.println('x = {x}');   // これはNG 実行すると x = {x} と出力される
リスト10 式の埋め込み (P)/(1.0)/(1.1)
var x = 10;
println("x = {x}");   // これはOK
println('x = {x}');   // これもOK

フォーマット (I)

インタープリタ版ではオブジェクトを文字列に変換する場合、式の後ろにformat asで指定しました。JavaFX 1.0からは式の前に直接フォーマットを指定します。

リスト11 フォーマット (I)
var x = 10;
System.out.println("x = {x format as <<%05d>>}"); 
リスト12 フォーマット (P)/(1.0)/(1.1)
var x = 10;
println("x = {%05d x}");

演算子と式

剰余 (I)

除算の余りを求める演算子が%からmodに変更になりました。

リスト13 除算の余りを求める (I)
var m = 10 % 3;
リスト14 除算の余りを求める (P)/(1.0)/(1.1)
var m = 10 mod 3;

等号否定演算子 (I)

等しくないことを表す関係演算子が<>から!=に変更されました。

リスト15 等しくない (I)
if (x <> 0) {
    ...
}
リスト16 等しくない (P)/(1.0)/(1.1)
if (x != 0) {
    ...
}

キャスト (I)

インタープリタ版ではJavaのように( )を使用してキャストを行っていましたが、as演算子に変更されました。

リスト17 NumberからIntegerへのキャスト (I)
var x: Number = 10.0;
var y: Integer = (Integer)x;
リスト18 NumberからIntegerへのキャスト (P)/(1.0)/(1.1)
var x: Number = 10.0;
var y: Integer = x as Integer;

アニメーションに関する演算子 (I)

インタープリタ版ではアニメーションをdur演算子を使用して行っていました。Preview SDKからはアニメーションはTimelineクラスとKeyFrameクラスを使用します。また、値の変化を示す=>演算子も導入されました。

たとえば、四角の幅を変化させるアニメーションは次のようになります。アニメーションについての詳しい説明は本連載第8回を参照してください。

リスト19 四角の幅を変化させる (I)
var width = [0..200] dur 1000; // 1 秒間で幅を0から200に変化させる
  
Rect {
    width: bind width
    height: 50
    fill: cyan
}

リスト20 四角の幅を変化させる (P)/(1.0)/(1.1)

var width = 0;
 
Timeline {
    keyFrames: [
        KeyFrame {
            time: 0s
            values: width => 0
        },
        KeyFrame {
            time: 1s
            values: width => 200
        }
    ]
}.play();
 
Rectangle {
    width: bind width
    height: 50
    fill: Color.CYAN
}

関数と構文

関数定義 (I)

インタープリタ版では関数定義がfunctionとoperatorの2種類がありました。Preview SDKからfunctionに統一されました。

リスト21 関数定義 (I)
function foo(x: Number): Number {
    return x*2.0;
}
  
operation bar(message: String): Void {
    System.out.println("BAR: {message}");
}
リスト22 関数定義 (P)/(1.0)/(1.1)
function foo(x: Number): Number {
    return x*2.0;
}
 
function bar(message: String): Void {
    println("BAR: {message}");
}

グローバル関数 (P)

インタープリタ版および、Preview SDKでは、標準出力に出力する場合、JavaのSystemクラスを使用する必要がありました。JavaFX 1.0ではグローバルな関数として、println関数やprint関数などが使用できるようになりました。

リスト23 標準出力へ出力 (I)/(P)
import java.lang.System;
System.out.println("Hello, World!");
リスト24 標準出力へ出力 (1.0)/(1.1)
println("Hello, World!");

do と do later (I)

非同期処理を行うdo文はサポートされなくなりました。また、JavaのSwingUtilitiesクラスのinvokeLaterメソッドに相当するdo later文もサポートされなくなりました。

非同期処理に関しては本連載第11回を参照してください。

例外処理 (I)

インタープリタ版では例外以外のオブジェクトもスローやキャッチを行うことができましたが、Preview SDKから例外だけに制限されました。

リストコンプリヘンション (I)

インタープリタ版では、あるシーケンスを基に別のシーケンスを作成するためにforeach文とselect文を使用できました。Preview SDKからforeach文もselect文もサポートされなくなりました。

Preview SDKからは、同様の処理を行うためにfor文を用いることができます。

リスト25 リストコンプリヘンション (I)
// 各要素を2倍にしたシーケンス
var x = [0..10];
var y = foreach(xx in x) xx * 2;
 
// 偶数だけを取り出す
var s = [0..10];
var t = select n from  n in s where n%2 == 0;
リスト26 リストコンプリヘンション (P)/(1.0)/(1.1)
// 各要素を2倍にしたシーケンス
var x = [0..10];
var y = for(xx in x) {
    xx * 2;
};
 
// 偶数だけを取り出す
var s = [0..10];
var t = for(n in s where n mod 2 == 0) {
    n;
};

import文 (I)

インタープリタ版ではimport文で別名を指定できました。たとえば、JavaとJavaFX Scriptで同じクラス名がある場合、次のように記述できました。

リスト27 import文の別名 (I)
import java.awt.Color as AWTColor;

var color = new AWTColor.BLACK;

この記法はPreview SDKからサポートされなくなりました。

ブロック構文 (I)

Preview SDKからブロック構文を使用できるようになりました。ブロック構文に関しては本連載第5回を参照してください。

リスト28 ブロック構文による変数の初期化 (P)/(1.0)/(1.1)
var x: Number = {
  10.0 * 10.0;
};

クラスとオブジェクト

クラス定義 (I)/(P)

インタープリタ版およびPreview SDKではクラスのアトリビュートをattributeで定義しましたが、JavaFX 1.0からvarもしくはdefで行うようになりました。

リスト29 クラス定義 (I)/(P)
class Foo {
    attribute value: String;
}

リスト30 クラス定義 (1.0)/(1.1)

class Foo {
    var value: String;
}

アトリビュートの初期化 (I)

インタープリタ版ではアトリビュートの初期化をクラス定義の外側で行っていました。Preview SDKからはクラス定義の中に宣言と一緒に記述します。

リスト31 アトリビュートの初期化 (I)
class Foo {
    attribute value: String;
}
 
attribute Foo.value = "Attribute";
リスト32 アトリビュートの初期化 (P)/(1.0)/(1.1)
class Foo {
    var value: String = "Attribute";
}

関数定義 (I)

インタープリタ版では、関数の宣言のみクラス定義内で行い、関数の実体はクラス定義の外側で行いました。Preview SDKから関数の実体もクラス定義内に記述するようになりました。また、戻り値がない場合に使用するVoid型はPreview SDKから導入されました。

リスト33 関数定義(I)
class Foo {
    function square(x: Number): Number;
}
 
function Foo.square(x: Number): Number {
    return x*x;
}
リスト34 関数定義 (P)/(1.0)/(1.1)
class Foo {
    function square(x: Number): Number {
        return x*x;
    }
}

さらに、インタープリタ版では戻り値として返すオブジェクトを直接関数に代入することもできましたが、この記法はサポートされなくなりました。

リスト35 オブジェクトを返す関数 (I)
class Foo {
    function getRect(x: Number , y: Number): Rect;
}

function Foo.getRect(x: Number, y: Number) = Rect {
    x: x, y: y
    width: 100, height: 50
};
リスト36 オブジェクトを返す関数 (P)/(1.0)/(1.1)
class Foo {
    function getRect(x: Number, y: Number): Rectangle {
        Rectangle {
            x: x, y: y
            width: 100, height: 50
        }
    }
}

オーバーライド (I)/(P)

インタープリタ版ではサブクラスがスーパクラスのアトリビュートの初期値を変更する場合や、関数をオーバライドする場合でも特に指定は必要ありませんでした。Preview SDKではアトリビュートの初期値を変更する場合のみoverrideを記述する必要がありました。

JavaFX 1.0からは、アトリビュートの初期値を変更する場合でも、関数をオーバーライドする場合でも、overrideキーワードを記述しなくてはならなくなりました。

リスト37 オーバーライド (I)
class Foo {
    attribute value: String;
    function action();
}
attribute Foo.value = "FOO";
function Foo.action() {
    // 処理
}
 
class Bar extends Foo {}
attribute Bar.value = "Bar";
function Bar.action() {
    // 処理
}
リスト38 オーバーライド (1.0)/(1.1)
abstract class Foo {
    var value = "FOO";
    function action() {
        // 処理
    }
}
 
class Bar extends Foo {
    override var value = "BAR";
    override function action() {
        // 処理
    }
}

アブストラクトクラス (I)

インタープリタ版ではアブストラクトクラスを定義するための明示的なキーワードはありません。その代わりに、クラス定義の最後にピリオドを3つつなげて記述しました。

Preview SDKからはJavaと同じようにabstractで表すようになりました。

リスト39 アブストラクトクラス (I)
class Foo {
    function action();
    ...
}
 
class Bar extends Foo {}
function Bar.action() {
    // 処理
}
リスト40 アブストラクトクラス (P)/(1.0)/(1.1)
abstract class Foo {
    abstract function action(): Void;
}

class Bar extends Foo {
    override function action(): Void {
        // 処理
    }
}

アクセス修飾子 (I)/(P)

Preview SDKまではアクセス修飾子はJavaと同様にprivate、パッケージプライベート、protected、publicの4種類でした。JavaFX 1.0からは大幅に増え、読み取り専用のpublic-readや、初期化のみ可能なpublic-initなどが使えるようになりました。

アクセス修飾子に関しては本連載第7回を参照してください。

初期化ブロック (I)

Preview SDKからオブジェクトを生成する時に処理される初期化ブロックが使用できるようになりました。初期化ブロックに関しては本連載第7回を参照してください。

リスト41 初期化ブロック (1.0)/(1.1)
class Foo {
    init {
    	// オブジェクト生成の最終段階で処理される
    }
    postinit {
    	// オブジェクト生成後に処理される
    }
}

関数型アトリビュートのコール (I)

関数型のアトリビュートをコールする場合、インタープリタ版ではアトリビュートを( )で囲む必要がありましたが、Preview SDKからは通常の関数のようにコールできるようになりました。

リスト42 関数型アトリビュートのコール (I)
class Foo {
    attribute action: function(x: Number): Number;
}
 
var foo = Foo{};
foo.action = function(x: Number): Number {  return x*x; };
 
var y = (foo.action)(10);
リスト43 関数型アトリビュートのコール (P)/(1.0)/(1.1)
class Foo {
    var action: function(x: Number): Number;
}
var foo = Foo{};
foo.action = function(x: Number): Number { return x*x; };
 
var y = foo.action(10);

アトリビュートを初期化しないオブジェクト生成 (I)

インタープリタ版ではアトリビュートを初期化せずにオブジェクトを生成する場合、括弧を省略できました。Preview SDKからは括弧の省略がサポートされなくなりました。

リスト44 アトリビュートを初期化せずにオブジェクト生成 (I)
class Foo {
    attribute value: String;
}
 
var foos: Foo* = [
    Foo { value: "value" }, // アトリビュートを初期化
    Foo {}, // アトリビュートを初期化しない
    Foo     // アトリビュートを初期化しない
];
リスト45 アトリビュートを初期化せずにオブジェクト生成 (P)/(1.0)/(1.1)
class Foo {
    var value: String;
}
 
var foos: Foo[] = [
    Foo { value: "Value" }, // アトリビュートを初期化
    Foo {}  // アトリビュートを初期化しない
];

オブジェクト自身を表す変数 (I)

インタープリタ版ではオブジェクト生成時に、自分自身を表す変数を作成することができました。しかし、Preview SDKからはサポートされなくなりました。以下のコードでは変数selfがPersonオブジェクト自体を指しています。

リスト46 自分自身を表す変数 (I)
class Person {
    attribute name:  String;
}
 
var person = Person {
    var: self
    name: "Sakuraba"
};

シーケンス、トリガ、バインド

間隔を指定したシーケンス (I)

インタープリタ版ではシーケンスの要素間の間隔を指定する場合、第1要素と第2要素を記述しました。Preview SDKからはstepで記述します。

リスト47 1から12までの奇数 (I)
var seq = [1, 3..12];
リスト48 1から12までの奇数 (P)/(1.0)/(1.1)
var seq = [1..12 step 2];

シーケンスからシーケンスを作成する (I)

インタープリタ版ではシーケンスからシーケンスを作成する時にピリオド(,)使用する方法とバー(|)を使用する方法がありました。Preview SDKからは、バーを使用する方法に統一されています。

リスト49 5以上のシーケンス (I)
var seq = [1..10];
var seq2 = seq[ . >= 5];   // seq2とseq3はどちらでも結果は同じ
var seq3 = seq[n | n >= 5];
リスト50 5以上のシーケンス (P)/(1.0)/(1.1)
var seq = [1..10];
var seq2 = seq[n | n >= 5];

シーケンスへの要素の挿入 (I)

インタープリタ版ではシーケンスの先頭に要素を追加する場合、as first intoを使用しました。同様に最後に追加する場合はas last intoを使用しました(intoのみでも最後に追加します)。Preview SDKからはas last intoおよびas last intoはサポートされなくなりました。

リスト51 シーケンスに要素を挿入 (I)
var seq = [1..10];
 
insert 0 as first into seq; // 先頭に0を挿入
insert 20 as last into seq; // 最後に20を追加
リスト52 シーケンスに要素を挿入(P)/(1.0)/(1.1)
var seq = [1..10];

insert 0 before seq[0]; // 先頭に0を挿入
insert 20 into seq; // 最後に20を追加

トリガ (I)

インタープリタ版ではトリガに次の4種類がありました。

  • 生成トリガ
  • 挿入トリガ
  • 削除トリガ
  • 置換トリガ

Preview SDKからは、生成トリガは初期化ブロック、その他のトリガは置換トリガで置き換えられました。

また、インタープリタ版ではトリガを設定できるのはアトリビュートに限られていましたが、Preview SDKからは変数とアトリビュートの両方にトリガを設定できるようになりました。

リスト53 生成トリガ (I)
class X {
    attribute value: Number;
}
 
trigger on new X {
    value = 10;
}
 
var x = X {};
System.out.println(x.value); // 10.0が出力
リスト54 生成トリガの代わりに初期化ブロックを使用 (P)/(1.0)/(1.1)
class X {
    var value: Number;
 
    postinit {
        value = 10;
    }
}
 
var x = X {};
println(x.value); // 10.0が出力
リスト55 挿入トリガ (I)
class X {
    attribute numbers: Number*;
}
attribute X.numbers = [0..10];
trigger on insert number into X.numbers {
    System.out.println(number); 
}

var x = X{};
insert 20 into x.numbers; // 20が出力
リスト56 挿入トリガの代わりに置換トリガを使用 (P)/(1.0)/(1.1)
class X {
    var numbers: Number[] = [0..10] on replace oldNums {
        // 挿入された要素が分らないので、変更前との差分を取る
        for (num in numbers) {
            if (num != oldNums[indexof num]) {
                println(num);
                break;
            }
        }
    }
}
 
var x = X {};
insert 20 into x.numbers; // 20が出力
リスト57 削除トリガ (I)
class X {
    attribute numbers: Number*;
}
attribute X.numbers = [0..10];
trigger on delete number from X.numbers {
    System.out.println(number); 
}

var x = X{};
delete x.numbers[10]; // 10が出力
リスト58 削除トリガの代わりに置換トリガを使用 (P)/(1.0)/(1.1)
class X {
    var numbers: Number[] = [0..10] on replace oldNums {
    	// 削除された要素が分らないので、変更前との差分を取る
        for (old in oldNums) {
            if (old != numbers[indexof old]) {
                println(old);
                break;
            }
        }
    }
}

var x = X {};
delete x.numbers[10]; // 10が出力
リスト59 置換トリガ (I)
class X {
    attribute number: Number;
}
attribute X.number = 10;
trigger on X.number[previous] = present {
    System.out.println("{previous} to {present}"); 
}

var x = X{};
x.number = 20; // 10 to 20 が出力
リスト60 置換トリガ (P)/(1.0)/(1.1)
class X {
    var number: Number = 10 on replace previous {
        println("{previous} to {number}");
    }
}
 
var x = X {};
x.number = 20; // 10.0 to 20.0 が出力

双方向バインド (I)

インタープリタ版では明示的に双方向バインドを表すことができませんでした。双方向バインドが使用できたのはTextFieldクラスのvalueアトリビュートなどに限定されていました。Preview SDKからはwith inverseを使用することで双方向バインドを表すことが可能になっています。

リスト61 双方向バインド (P)/(1.0)/(1.1)
var x = 10.0;
var y = bind x with inverse;
 
y = 20;
println("{x}"); // 20.0 が出力

バインドの遅延評価 (I)

インタープリタ版ではbind lazyを使用して、バインドの評価を遅延させることが可能でした。Preview SDKからはbind lazyはサポートされなくなりました。

国際化 (I)

インタープリタでは提供されていなかった国際化の機能が、Preview SDKから使用できるようになりました。詳しくは本連載第12回を参照してください。

API編

パッケージ (I)/(P)

パッケージはインタープリタ版、Preview SDK、そしてJavaFX 1.0の間で大きく変化しています。主なパッケージの変遷を表1に示しました。

表1 パッケージの変遷
パッケージの説明 バージョン パッケージ 主なクラス
アプリケーションの骨格をなすクラス群 インタープリタ javafx.ui Frame
Preview SDK javafx.application Frame, Application
JavaFX 1.0 javafx.stage Stage
GUIコンポーネントの基底となるクラス インタープリタ javafx.ui.canvas Node, Group, CompositeNode
Preview SDK javafx.scene Node, Group, CustomNode
JavaFX 1.0 javafx.scene Node, Group, CustomNode
シェイプ インタープリタ javafx.ui.canvas Circle, Line, Rect
Preview SDK javafx.scene.geometry Circle, Line, Rectangle
JavaFX 1.0 javafx.scene.shape Circle, Line, Rectangle
Swingコンポーネント インタープリタ javafx.ui Label, Button, TextField
Preview SDK javafx.ext.swing Label, Button, TextField
JavaFX 1.0 javafx.ext.swing SwingLabel, SwingButton, SwingTextField
イベント インタープリタ javafx.ui MouseEvent, KeyEvent
Preview SDK javafx.input MouseEvent, KeyEvent
JavaFX 1.0 javafx.scene.input MouseEvent, KeyEvent
色、グラデーション インタープリタ javafx.ui Color, LinearGradient, RadialGradient
Preview SDK javafx.scene.paint Color, LinearGradient, RadialGradient
JavaFX 1.0 javafx.scene.paint Color, LinearGradient, RadialGradient
エフェクト インタープリタ javafx.ui.filter ShadowFilter, GaussianBlur
Preview SDK javafx.scene.effect DropShadow, GaussianBlur
JavaFX 1.0 javafx.scene.effect DropShadow, GaussianBlur
変形 インタープリタ javafx.ui.canvas Translate, Scale, Rotate
Preview SDK javafx.scene.transform Translate, Scale, Rotate
JavaFX 1.0 javafx.scene.transform Translate, Scale, Rotate

クラス

アプリケーションの骨格 (I)/(P)

GUIを構築するベースとなるクラスは、インタープリタ版、Preview SDK、JavaFX 1.0で異なります。

インタープリタ版ではFrameクラスを使用し、Frameオブジェクトに直接GUIコンポーネントを貼ることができました。Preview SDKではFrameクラスもしくはSwingFrameクラスを使用しました。Frameクラスの場合はStageオブジェクトにGUIコンポーネントを貼ります。

JavaFX 1.0からはStageクラスがウィンドウを示します。そして、SceneオブジェクトにGUIコンポーネントを貼ります。

また、JavaFX 1.0からvisibleアトリビュートのデフォルト値がtrueに変更されました。

リスト62 四角を表示 (I)
Frame {
    title: "Sample"
    width: 200
    height: 200
    visible: true
    
    content: Canvas {
        content: Rect {
            x: 10, y: 10
            width: 100, height: 100
            fill: red
        }
    }
}
リスト63 四角を表示 (P)
Frame {
    title: "Sample"
    width: 200
    height: 200
    visible: true
 
    stage: Stage {
        content: Rectangle {
            x: 10 y: 10
            width: 100 height: 100
            fill: Color.RED
        }
    }
}
リスト64 四角を表示 (1.0)/(1.1)
Stage {
    title: "Sample"
    scene: Scene {
        width: 200
        height: 200
 
        content: Rectangle {
            x: 10 y: 10
            width: 100 height: 100
            fill: Color.RED
        }
    }
}

Swingコンポーネントとシェイプ (I)/(P)

インタープリタ版とPreview SDKではシェイプとSwingコンポーネントを別個に扱います。シェイプとSwingコンポーネントでは、コンテナとなるクラスも異なっていました。JavaFX 1.0ではシェイプとSwingコンポーネントはどちらもノードとして区別なく扱えるようになりました。

また、Preview SDKで提供されていたSwingFrameクラスは、JavaFX 1.0でStageクラスに統合されました。

リスト62 ボタンと四角を表示 (I)
Frame {
    title: "Sample"
    width: 200
    height: 200
    visible: true
    
    content: Canvas {
        content: [
            Rect {
                x: 30, y: 20
                width: 100, height: 100
                fill: red
            },
            View {
                content: Button {
                    text: "OK"
                }
            }
        ]
    }
}
リスト63 ボタンと四角を表示 (P)
SwingFrame {
    title: "Sample"
    width: 200
    height: 200
    visible: true
 
    content: Panel {
        width: 200 height: 200
        content: [
            Button {
                width: 50 height: 30
                text: "OK"
            },
            Canvas {
                width: 200 height: 200
                content: Rectangle {
                    x: 30 y: 20
                    width: 100 height: 100
                    fill: Color.RED
                }
            }
        ]
    }
}
リスト64 ボタンと四角を表示 (1.0)/(1.1)
Stage {
    title: "Sample"
    scene: Scene {
        width: 200
        height: 200
  
        content: [
            Rectangle {
                x: 30 y: 20
                width: 100 height: 100
                fill: Color.RED
            },
            SwingButton {
                text: "OK"
            }
        ]
    }
}

Swingコンポーネント群 (I)/(P)

Swingコンポーネント群はインタープリタ版、Preview SDKではほぼSwingのクラス名から先頭のJを抜いたものでした。たとえば、ボタンはButton、ラベルはLabelです。これに対し、JavaFX 1.0では先頭にSwingを明記するようになりました。ボタンはSwingButton、ラベルはSwingLabelです。

また、JavaFX 1.0ではインタープリタ版で提供されていたSwingクラスの多くが未サポートとなりました。たとえば、メニューやテキストエリアなどが未サポートになっています。同様にレイアウトのクラスもほとんどが未サポートとなりました。

メディアAPI (I)

インタープリタ版では提供されなかったメディアに関するクラスが、Preview SDKから提供されるようになりました。詳しくは本連載第10回を参照してください。

非同期処理、RESTful Webサービス (I)/(P)

インタープリタ版、Preview SDKでは提供されなかった非同期処理やRESTful Webサービス用のクラスが、JavaFX 1.0から提供されるようになりました。詳しくは本連載第11回を参照してください。

国際化 (I)

インタープリタ版では提供されなかった国際化に関するクラスが、Preview SDKから提供されるようになりました。詳しくは本連載第12回を参照してください。

Production Suite (1.0)

JavaFX 1.0ではFXDおよびFXZ形式のファイルを読み込むためのクラスはProduction Suiteに含まれていましたが、JavaFX 1.1からデフォルトで提供されるようになました。

おすすめ記事

記事・ニュース一覧