今回は、前半でJavaFXに特有な機能である、バインドとトリガーについて紹介します。後半では、JavaFX Composerを用いてエフェクトについて解説します。

 エフェクトは影を付けるなど、ノードの見た目を変化させる機能です。JavaFX Composerを使えば、エフェクトも簡単に設定できます。

バインド

 GUIアプリケーションの構造としてよく知られているのが、モデル-ビュー-コントローラ(MVC) 構造です。

 MVC構造はビューとモデルを分離することにより、ビューを可換にすることが可能になるなど、さまざまな特徴を持ちます。

 MVC構造では、モデルに保持するデータが更新された場合、ビューにその更新を通知する必要があります。ここでよく使用されるのが、デザインパターンのオブザーバーパターンです。

 しかし、オブザーバーパターンを用いるとしても、ビューをモデルに同期させる処理を記述する必要があります。そして、モデルが複雑になってくると、この同期のための記述がどんどん増えていってしまいます。

 この記述はビジネスロジックや、ビューの構成には直接関わりのない部分なので、できれば記述量は最小限に抑えておきたいところです。

 そこで、登場するのが、モデルとビューの同期を自動で行なうことのできるバインドです。

 バインドを用いることで、変数を他の変数に同期させることができます。すなわち、モデルのデータが変更したら、その変更が自動的にビューに反映させるということが可能になるのです。

 バインドを行なうには、変数の定義時にバインドを行なうことを明示するだけです。

var x = 10;
var y = bind x; // yをxにバインドさせる
 
println("x = {x} y = {y}");
 
x = 20; // 同時にyも変更される
 
println("x = {x} y = {y}");

 変数の定義時にバインドするには、bindキーワードと同期させたい変数を記述します。上記のスクリプトでは、2行目で変数yを変数xにバインドしています。

 バインドした変数は、バインド元の変数が更新されたら、自動的に更新されます。上記のスクリプトでは変数xに20が代入された時点で、変数yも自動的に20に更新します。

 スクリプトを実行すると次のようになります。

x = 10 y = 10
x = 20 y = 20

 このように、変数yを更新する記述を書かなくても、バインドを使うことで自動的に更新します。

 一度、バインドした変数は、バインドを解除することはできません。したがって、次のスクリプトはコンパイルエラーになります。

var x = 10;
var y = bind x; // yをxにバインドさせる
 
y = 20; // NG バインドした変数に代入はできない