closeActionとfunction
ただし、完全に旧Frameと同じというわけではなく、いくつか機能拡張されたところもあります。例えば、「closeAction」アトリビュートなどもその一つです。これは、ウインドウを閉じるときの動作を示すアトリビュートで、これを利用することでクローズボックスをクリックしたときの処理を簡単に組み込むことができます。
package fxsample;
import java.lang.System;
import javafx.ext.swing.*;
SwingFrame {
title: "Title"
width: 200
height: 200
visible: true
content: Label {
text: "new JavaFX!"
}
closeAction: function(){
System.exit(0);
}
}
これが、closeActionを組み込んだサンプルです。ここでは、クローズボックスをクリックすると、System.exitを呼び出しプログラムを終了しています。
このcloseActionには、functionが値として設定されているのが分かりますね。0.7のスクリプトに慣れている人なら「なぜ、function? operationではないのか?」と思われたはずです。
結論から言うと、1.0では「operationがない」のです! 処理を記述するためのものはfunctionに統一されており、0.7でoperationを使って記述していた処理はすべてfunctionに書き換えることになります。
これはかなり大きな仕様の変更ですが、考えてみれば0.7の「operationとfunctionを使い分けて書く」という書き方は、分かりにくく、あまり意味がない感はありました。functionへの統一は、ソースコードをよりシンプルにするという点で理解できるものでしょう。
Canvasによるグラフィック表示
1.0で大きく変わったのは、Swingコンポーネント関係よりも、グラフィック表示関係でしょう。0.7では、Canvasの中にグラフィックのシェイプ・クラスを用意して図形を表示させていました。では、0.7でのごく簡単な図形描画のサンプルをあげましょう。FrameにCanvasを配置し、そこにCircleを使って円を表示するサンプルです。
import javafx.ui.*;
import javafx.ui.canvas.*;
Frame {
title:"タイトル"
width:200
height:200
visible:true
content: Canvas {
content: [
Circle {
cx: 100, cy: 80
radius: 50
fill: red
}
]
}
}
これを、1.0のスクリプトとして書き直してみましょう。1.0でも、SwingFrameにCanvasを配置してグラフィックを描画することは可能です。では、今のサンプルを1.0で書き直してみましょう。
package fxsample;
import javafx.ext.swing.*;
import javafx.scene.geometry.Circle;
import javafx.scene.paint.Color;
SwingFrame {
title: "Title"
width: 200
height: 200
visible: true
content: Canvas {
content: [
Circle {
centerX: 100, centerY: 80
radius: 50
fill: Color.RED
}
]
}
}

ここでは、SwingFrameのcontentにCanvasを組み込み、その中のcontentにCircleを組み込んで円を表示しています。大体の流れは同じですが、よく見ると細かな点でいろいろと違いがあります。
まず、パッケージの問題。1.0では、Circleなどの図形クラスはjavafx.scene.geometryパッケージに、また色を示すColorクラスはjavafx.scene.paintパッケージにそれぞれ用意されています。Circleというクラスそのものは変わっていませんが、中心位置のアトリビュートが「cx」「cy」から「centerX」「centerY」に変わっているなど、完全に同じというわけではありません。
色の指定も、0.7では単に「red」とだけ指定すればよかったものが、「Color.RED」というようにColorクラスのアトリビュートに変わっています。このColorクラスは、0.7と比べるとかなり強化されており、新たに色を作成するためのfunctionも次のようにいろいろと用意されています。
Color.color([red], [green], [blue]); Color.rgb([red], [green], [blue]); Color.web([16進数のString]);
非常に面白いのは、webでしょう。"#FF0000"というように、Webでの16進数によるテキストを使ってColorを生成することができます。またこれらのいずれも、最後に透過度の値を指定することもできます。
