何のAdvent Calendarを書いているかわからなくなってきている
ミケです。
これは『JavaFX Advent Calendar』の第13日目のエントリーになります。
昨日はtaizさんの「JavaFX Media playerのちょっと面白い機能」でした。
GroovyのBindable and Vetoable transformation
JavaFXなのにGroovyのことを少し説明しておきます。
Bindable and Vetoable transformationというのは、
Groovy Beans(Java Beansとまあほぼ同等)に関する値変化を検知して、
何かしらの処理を挟み込むGroovyの機能です。
Vetoable
ちょっと言葉だけで説明したのでは
わかりづらいと思いますので、
実例を書きます。
クラス
Person
のage
というフィールドに@Vetoable
アノテーションを付与しました。これによって、値変化を検出することができるようになります。
その後の部分、
person.vetoableChange = {//do something}
の部分で処理を記述します。ちょっと前に書いてある部分の
Person.metaClass.define {// define something}
は誕生日メソッドを追加しているだけです。
で、実行結果が次のとおりです。
見事、
age
の値変化によって、処理を実行させることができました。なお、もっと興味のある方はこちらを御覧ください。
JavaFXでこれ使えないかな…
というわけで、値変化に応じて処理を実行させてUIの表示を変えられないか、
そんなことを考えてみました。
とりあえず、テキストフィールドに値を入力して、
ラベルが変更されるような簡単なアプリケーションを
作ってみたいと思います。
とりあえず、Scene Builderで、
テキストフィールドとラベルがあるような
画面を作ります。
で、作りたいのは、テキストフィールドに入力すると
左下のラベルには同じ文字列、
右下のラベルには挨拶文がでるようなアプリケーションです。
さて、
AnchorPane
にコントロールを貼り付けたら、AnchorPane
にコントローラーを割り当てます。次に、テキストフィールドにイベントメソッドを割り当てます。
それから、使うテキストフィールドやらラベルやらに
fx:id
を割り当てておきます。こうして、Scene Builderで
fxml
を作成すると、@FXML
アノテーションによってコントローラークラスに自動的にインジェクションされます。
で、モデルになっているクラスはこちら。
コードの概要
コントローラークラスのメソッド
initialize
メソッドは、fxml
ファイルを読み込んだ時点で実行されるメソッドです。そのメソッドにおいて、
@Vetoable
を割り当てたPerson
クラスをインスタンス化して、さらに
vetoableChange
を割り当てます。また、テキストフィールドでキーがリリースされた後に呼び出される
keyReleased
メソッドにおいてPerson
インスタンスのVetoable
なフィールドname
の値を変更します。そして、その結果を左下のラベルに、
vetoableChange
で実行された結果を右下のラベルにそれぞれ反映します。
実行結果
では、こいつを実行してみましょう。
なんか、かわいげのない画面です。
テキストフィールドに文字を入力してみます。
いい感じにラベルに文字列が反映されていますね。
これ何がうれしいの?
先ほどの
initialize
メソッドではPerson
をインスタンス化person
の値変化を付与
という処理をしていますが、
言ってしまえばこれらの処理は、全部
Person
にさせるべきなんです。そうすると、コントローラーはより単純な記述になります。
そして、この振る舞いについて、テストを書くことができます。
テスト実行
テストしづらいと思っていたJavaFXのテストが少し容易になった気がします。
こんな感じでJavaFXにGroovyを利用することで、
テストしやすくなるかもしれません。
おしまい
そんなわけで、皆さんもGroovyでJavaFXをやってみてはいかがでしょうか。
明日は2巡目の@skrbさんです。よろしくおねがいします。
0 件のコメント:
コメントを投稿