何の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 件のコメント:
コメントを投稿