JavaFX Scriptはインタープリタ版、
そこで、
ここで、
- (I) ... インタープリタ版
- (P) ... Preview SDK
- (1.
0) ... JavaFX 1. 0 - (1.
1) ... JavaFX 1. 1
たとえば、
目次
文法編
データ型と変数
数値型の変更 (I)/(P)/(1.
インタープリタ版では数値型はInteger、
JavaFX 1.
さらに、
- Byte
- Short
- Long
- Float
- Double
それぞれ、
時間間隔 (I)
時間間隔を表すDuration型が導入され、
var u: Duration = 2h; // 2時間
var v: Duration = 30m; // 30分
var x: Duration = 1.0s; // 1秒
var y: Duration = 10ms; // 10ミリ秒
複数の要素からなる変数 (I)
インタープリタ版では変数が複数の要素を持つかどうかを示すために?、
var x? = [0..10]; // nullの可能性がある
var y+ = 5; // 変数の個数が1個以上
var z* = [2..5]; // 変数の個数が0個以上
var x: Integer[] = [0..10];
var y: Integer[] = 5;
var z: Integer[] = [2..5];
定数 (I)/(P)
JavaFX 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)
インタープリタ版では定数の型の記述を省略できましたが、
Rect {
width: 200
height: 1000
fill: red
};
Rectangle {
width: 200
height: 1000
fill: Color.RED
};
複数行に渡る文字列 (I)
インタープリタ版では複数行に渡るリテラル文字列が許されていましたが、
var text = "This
is
a multiline
string.";
var text = "This\nis\na multiline\nstring.";
文字列への式の埋め込み (I)
インタープリタ版ではダブルクオテーションで囲まれた文字列のみ式の埋め込みが可能でした。Preview SDKからはダブルクオテーションだけでなく、
var x = 10;
System.out.println("x = {x}"); // これはOK
System.out.println('x = {x}'); // これはNG 実行すると x = {x} と出力される
var x = 10;
println("x = {x}"); // これはOK
println('x = {x}'); // これもOK
フォーマット (I)
インタープリタ版ではオブジェクトを文字列に変換する場合、
var x = 10;
System.out.println("x = {x format as <<%05d>>}");
var x = 10;
println("x = {%05d x}");
演算子と式
剰余 (I)
除算の余りを求める演算子が%からmodに変更になりました。
var m = 10 % 3;
var m = 10 mod 3;
等号否定演算子 (I)
等しくないことを表す関係演算子が<>から!=に変更されました。
if (x <> 0) {
...
}
if (x != 0) {
...
}
キャスト (I)
インタープリタ版ではJavaのように( )を使用してキャストを行っていましたが、
var x: Number = 10.0;
var y: Integer = (Integer)x;
var x: Number = 10.0;
var y: Integer = x as Integer;
アニメーションに関する演算子 (I)
インタープリタ版ではアニメーションをdur演算子を使用して行っていました。Preview SDKからはアニメーションはTimelineクラスとKeyFrameクラスを使用します。また、
たとえば、
var width = [0..200] dur 1000; // 1 秒間で幅を0から200に変化させる
Rect {
width: bind width
height: 50
fill: cyan
}
リスト20 四角の幅を変化させる (P)/(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に統一されました。
function foo(x: Number): Number {
return x*2.0;
}
operation bar(message: String): Void {
System.out.println("BAR: {message}");
}
function foo(x: Number): Number {
return x*2.0;
}
function bar(message: String): Void {
println("BAR: {message}");
}
グローバル関数 (P)
インタープリタ版および、
import java.lang.System;
System.out.println("Hello, World!");
println("Hello, World!");
do と do later (I)
非同期処理を行うdo文はサポートされなくなりました。また、
非同期処理に関しては本連載第11回を参照してください。
例外処理 (I)
インタープリタ版では例外以外のオブジェクトもスローやキャッチを行うことができましたが、
リストコンプリヘンション (I)
インタープリタ版では、
Preview SDKからは、
// 各要素を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;
// 各要素を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文で別名を指定できました。たとえば、
import java.awt.Color as AWTColor;
var color = new AWTColor.BLACK;
この記法はPreview SDKからサポートされなくなりました。
ブロック構文 (I)
Preview SDKからブロック構文を使用できるようになりました。ブロック構文に関しては本連載第5回を参照してください。
var x: Number = {
10.0 * 10.0;
};
クラスとオブジェクト
クラス定義 (I)/(P)
インタープリタ版およびPreview SDKではクラスのアトリビュートをattributeで定義しましたが、
class Foo {
attribute value: String;
}
リスト30 クラス定義 (1.
class Foo {
var value: String;
}
アトリビュートの初期化 (I)
インタープリタ版ではアトリビュートの初期化をクラス定義の外側で行っていました。Preview SDKからはクラス定義の中に宣言と一緒に記述します。
class Foo {
attribute value: String;
}
attribute Foo.value = "Attribute";
class Foo {
var value: String = "Attribute";
}
関数定義 (I)
インタープリタ版では、
class Foo {
function square(x: Number): Number;
}
function Foo.square(x: Number): Number {
return x*x;
}
class Foo {
function square(x: Number): Number {
return x*x;
}
}
さらに、
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
};
class Foo {
function getRect(x: Number, y: Number): Rectangle {
Rectangle {
x: x, y: y
width: 100, height: 50
}
}
}
オーバーライド (I)/(P)
インタープリタ版ではサブクラスがスーパクラスのアトリビュートの初期値を変更する場合や、
JavaFX 1.
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() {
// 処理
}
abstract class Foo {
var value = "FOO";
function action() {
// 処理
}
}
class Bar extends Foo {
override var value = "BAR";
override function action() {
// 処理
}
}
アブストラクトクラス (I)
インタープリタ版ではアブストラクトクラスを定義するための明示的なキーワードはありません。その代わりに、
Preview SDKからはJavaと同じようにabstractで表すようになりました。
class Foo {
function action();
...
}
class Bar extends Foo {}
function Bar.action() {
// 処理
}
abstract class Foo {
abstract function action(): Void;
}
class Bar extends Foo {
override function action(): Void {
// 処理
}
}
アクセス修飾子 (I)/(P)
Preview SDKまではアクセス修飾子はJavaと同様にprivate、
アクセス修飾子に関しては本連載第7回を参照してください。
初期化ブロック (I)
Preview SDKからオブジェクトを生成する時に処理される初期化ブロックが使用できるようになりました。初期化ブロックに関しては本連載第7回を参照してください。
class Foo {
init {
// オブジェクト生成の最終段階で処理される
}
postinit {
// オブジェクト生成後に処理される
}
}
関数型アトリビュートのコール (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);
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)
インタープリタ版ではアトリビュートを初期化せずにオブジェクトを生成する場合、
class Foo {
attribute value: String;
}
var foos: Foo* = [
Foo { value: "value" }, // アトリビュートを初期化
Foo {}, // アトリビュートを初期化しない
Foo // アトリビュートを初期化しない
];
class Foo {
var value: String;
}
var foos: Foo[] = [
Foo { value: "Value" }, // アトリビュートを初期化
Foo {} // アトリビュートを初期化しない
];
オブジェクト自身を表す変数 (I)
インタープリタ版ではオブジェクト生成時に、
class Person {
attribute name: String;
}
var person = Person {
var: self
name: "Sakuraba"
};
シーケンス、トリガ、バインド
間隔を指定したシーケンス (I)
インタープリタ版ではシーケンスの要素間の間隔を指定する場合、
var seq = [1, 3..12];
var seq = [1..12 step 2];
シーケンスからシーケンスを作成する (I)
インタープリタ版ではシーケンスからシーケンスを作成する時にピリオド(,)使用する方法とバー(|)を使用する方法がありました。Preview SDKからは、
var seq = [1..10];
var seq2 = seq[ . >= 5]; // seq2とseq3はどちらでも結果は同じ
var seq3 = seq[n | n >= 5];
var seq = [1..10];
var seq2 = seq[n | n >= 5];
シーケンスへの要素の挿入 (I)
インタープリタ版ではシーケンスの先頭に要素を追加する場合、
var seq = [1..10];
insert 0 as first into seq; // 先頭に0を挿入
insert 20 as last into seq; // 最後に20を追加
var seq = [1..10];
insert 0 before seq[0]; // 先頭に0を挿入
insert 20 into seq; // 最後に20を追加
トリガ (I)
インタープリタ版ではトリガに次の4種類がありました。
- 生成トリガ
- 挿入トリガ
- 削除トリガ
- 置換トリガ
Preview SDKからは、
また、
class X {
attribute value: Number;
}
trigger on new X {
value = 10;
}
var x = X {};
System.out.println(x.value); // 10.0が出力
class X {
var value: Number;
postinit {
value = 10;
}
}
var x = X {};
println(x.value); // 10.0が出力
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が出力
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が出力
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が出力
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が出力
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 が出力
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を使用することで双方向バインドを表すことが可能になっています。
var x = 10.0;
var y = bind x with inverse;
y = 20;
println("{x}"); // 20.0 が出力
バインドの遅延評価 (I)
インタープリタ版ではbind lazyを使用して、
国際化 (I)
インタープリタでは提供されていなかった国際化の機能が、
API編
パッケージ (I)/(P)
パッケージはインタープリタ版、
パッケージの説明 | バージョン | パッケージ | 主なクラス |
---|---|---|---|
アプリケーションの骨格をなすクラス群 | インタープリタ | javafx. |
Frame |
Preview SDK | javafx. |
Frame, Application | |
JavaFX 1. |
javafx. |
Stage | |
GUIコンポーネントの基底となるクラス | インタープリタ | javafx. |
Node, Group, CompositeNode |
Preview SDK | javafx. |
Node, Group, CustomNode | |
JavaFX 1. |
javafx. |
Node, Group, CustomNode | |
シェイプ | インタープリタ | javafx. |
Circle, Line, Rect |
Preview SDK | javafx. |
Circle, Line, Rectangle | |
JavaFX 1. |
javafx. |
Circle, Line, Rectangle | |
Swingコンポーネント | インタープリタ | javafx. |
Label, Button, TextField |
Preview SDK | javafx. |
Label, Button, TextField | |
JavaFX 1. |
javafx. |
SwingLabel, SwingButton, SwingTextField | |
イベント | インタープリタ | javafx. |
MouseEvent, KeyEvent |
Preview SDK | javafx. |
MouseEvent, KeyEvent | |
JavaFX 1. |
javafx. |
MouseEvent, KeyEvent | |
色、 |
インタープリタ | javafx. |
Color, LinearGradient, RadialGradient |
Preview SDK | javafx. |
Color, LinearGradient, RadialGradient | |
JavaFX 1. |
javafx. |
Color, LinearGradient, RadialGradient | |
エフェクト | インタープリタ | javafx. |
ShadowFilter, GaussianBlur |
Preview SDK | javafx. |
DropShadow, GaussianBlur | |
JavaFX 1. |
javafx. |
DropShadow, GaussianBlur | |
変形 | インタープリタ | javafx. |
Translate, Scale, Rotate |
Preview SDK | javafx. |
Translate, Scale, Rotate | |
JavaFX 1. |
javafx. |
Translate, Scale, Rotate |
クラス
アプリケーションの骨格 (I)/(P)
GUIを構築するベースとなるクラスは、
インタープリタ版ではFrameクラスを使用し、
JavaFX 1.
また、
Frame {
title: "Sample"
width: 200
height: 200
visible: true
content: Canvas {
content: Rect {
x: 10, y: 10
width: 100, height: 100
fill: red
}
}
}
Frame {
title: "Sample"
width: 200
height: 200
visible: true
stage: Stage {
content: Rectangle {
x: 10 y: 10
width: 100 height: 100
fill: Color.RED
}
}
}
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コンポーネントでは、
また、
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"
}
}
]
}
}
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
}
}
]
}
}
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コンポーネント群はインタープリタ版、
また、
メディアAPI (I)
インタープリタ版では提供されなかったメディアに関するクラスが、
非同期処理、
インタープリタ版、
国際化 (I)
インタープリタ版では提供されなかった国際化に関するクラスが、
Production Suite (1.
JavaFX 1.