2012年12月13日木曜日

JavaFXでGroovyのVetoableが機能するか試してみた #javafx-ja

Advent Calendarたくさん書きすぎて、

何の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


ちょっと言葉だけで説明したのでは

わかりづらいと思いますので、

実例を書きます。




クラス Personageというフィールドに@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 件のコメント:

コメントを投稿

コメントを投稿