オペレーションをクラスに追加する
さて、先ほどはactionにそのままオペレーションを用意していましたが、やはり処理部分は切り離して整理しておきたいものですね。せっかくモデルクラスを用意したのですから、ここはオペレーションもモデルクラスにまとめておくことにしましょう。
import javafx.ui.*;
class MyDataModel {
attribute labelText: String;
attribute fieldValue: String;
operation btnAction();
}
operation MyDataModel.btnAction(){
var s = this.fieldValue;
var res = "あなたは、{s}と書いた。";
this.labelText = res;
}
var model: MyDataModel = MyDataModel {
labelText: "Hello!"
};
Frame {
centerOnScreen: true
width: 300
height: 120
title: "JavaFX"
content: BorderPanel {
top: Label {
text: bind model.labelText
font: Font {
size: 16
style: [BOLD]
}
}
center: TextField {
value: bind model.fieldValue
}
bottom: Button {
text: "Click"
action: operation(){
model.btnAction();
}
}
}
visible: true
}
オペレーションのクラスへの追加は、Javaとはだいぶ勝手が違いますから注意が必要です。クラス内に書かれているのは、たったこれだけです。
operation btnAction();
JavaFX Scriptの場合、クラスにはオペレーションの宣言文だけしか記述しません。具体的な実装部分は、その後に用意します。それがこの部分です。
operation MyDataModel.btnAction(){
var s = this.fieldValue;
var res = "あなたは、{s}と書いた。";
this.labelText = res;
}
クラスに用意するオペレーションは、「operation クラス.オペレーション」といった形で記述をします。これは、クラス内に宣言したオペレーションと名前や引数の指定が同じでないといけません。
また、クラス内のオペレーションでは、同じインスタンス内のアトリビュートやオペレーションを示すのに「this」が使えます。このあたりはJavaと同じ感覚で利用できそうですね。
「バインド」と「モデルクラス」を使うようになるあたりから、JavaFX Script特有の考え方に少しずつ慣れていく必要が生じてくるでしょう。これまでは、「Javaの簡易版スクリプト言語」といった感じで利用することができましたが、JavaFX Scriptは、決して「Javaからいろいろ機能を取り除いて簡単にしただけのもの」ではないのです。JavaFX Script特有のコーディングスタイルに少しずつ慣れていきましょう。