JavaFX Night でバインドの発表をしてきた

このエントリーは、2014 年の JavaFX Advent Calendar の 1 日目のエントリーです。

明日は alchemicalogic さんです。

blog も半年ぶりなわけですが、それよりも久しぶりの JavaFX の勉強会である JavaFX Night を 11/25 に開催しました。ほぼ 1 年ぶりです ^ ^;;

雨という悪コンディションの中、約 50 人の方にご参加いただきました。もっとキャンセルが多いかと思っていたのですが、うれしい誤算でした。

櫻庭は、バインドについての発表を行いました。

実をいうと資料は使いまわし。7/11 に大阪で よなよな JavaFX というイベントを開催したのですが、そこで話した内容と同じです。

資料はこちら。

Property

バインドは JavaFX 1.x 時代の JavaFX Script では言語でサポートされた機能でした。その当時のバインドは簡単に使えるものだったのですが、JavaFX 2 で JavaFX Script が廃止されたため JavaAPI として書き直されています。

そのため、簡単に使えたバインドが、結構めんどくさくなってしまいました。

その一番のめんどくさいところが、Property。

JavaFX 2 からはバインドできる対象を Property としたのです。Property は値を 1 つだけもてるコレクションのようなものです。Property を使うと、保持している値が変更されたときにイベントが発生します。

このイベントの受け取り方は 2 種類あり、一方が ChangeListner、もう一方が InvalidationListener です。

ChangeListener は値が変更すると、即座にコールされます。それに対して、InvalidationListener は値が変更しても、その値を使わなければコールされません。ようするにイベントの発生が遅延されます。

そして、バインドはこちらの InvalidationListener を使用して実装されています。

バインド

バインドは bind メソッドで行い、両方向のバインドは bindBiDirectional メソッドで行います。

バインドを行うことで、Property 同士の値を自動的に同期させることができます。

その他、Bindings クラスが提供しているさまざまな演算を組み合わせることで複雑な演算や、論理演算もバインドで可能になります。

バインドのユースケース

最後にバインドのユースケースを 4 つ紹介しました。

  • 知らないうちにバインドを使用している
  • View と Controller や、Controller と Model をバインドさせる
  • バリデーションや制約
  • アニメーション

最初の知らないうちというのは TableView などのクラスに関してです。作法に則って記述していれば、いつの間にバインドを使っているはずです。

そして、一番多く使われるのが、2 番目の使い方だと思います。まぁ、普通の使い方ですね。

3 番目の使い方が、意外に便利です。テキストフィールドになにか入力がないとボタンを押せないとか、数値しか入力させないようにするとか、レイアウトにつかうなどです。この用途は、ほんとに使い道いろいろなので、自分でも発掘していこうと思ってます。

最後のアニメーションはおまけです。おととしの Advent Calendar で書いた、irof さんの絵描き歌 を紹介しました。

講演後、バインド使ってみますという感想をいただけたので、よかったのではないかと思います。まだ、バインド使いこなしている人はすくないようなので、ぜひみなさんも使ってみてください!!