2014-01-04

JavaFX にて,ボタンにリスナー登録 (addEventFilter と addEventHandler の違い)

JavaFX いじり,その2です.コンポーネントにイベントリスナーを登録する話.

--

本日のサンプルコードはこちら.

AWT パッケージでいうところの Component は,おおよそ JavaFX での Node というクラスに当たるようです. (だから,多分本当は「コンポーネント」という表現は良くないのかもしれません…)
それで, Node のサブクラスであるそれぞれのコンポーネントを表現するクラスは java.scene 下のパッケージで色々と用意されているようです.

Node#addEventHandler メソッド,及び Node#addEventFilter メソッドでイベントリスナーを登録します.この感覚はおおよそ AWT と変わらなさそうですが, addEventHandler と addEventFilter はどう違うの?ということ.

addEventFilter メソッドの Javadoc には「イベント伝達の capturing phaze」に呼ばれると書いてあり, addEventHandler メソッドの Javadoc には,「イベント伝達の bubbling phaze」に呼ばれると書いてあります.

つまり, Node クラスはツリー構造を持ち,ツリーの親要素から子要素に向かってイベントが伝播してゆくときに呼ばれるのが addEventFilter メソッドで登録されたリスナーであり,そのイベント完了が子要素から親要素に伝播するときに呼ばれるのが addEventHandler メソッドで登録されたリスナー,というようですね.

なので,サンプルコードでは (JDK 8 (Early Access) で書いてあるので注意!)

    button.addEventHandler(MouseEvent.MOUSE_PRESSED,
            e -> System.out.println("Handler 1"));
    button.addEventFilter(MouseEvent.MOUSE_PRESSED,
            e -> System.out.println("Filter 2"));
    button.addEventHandler(MouseEvent.MOUSE_PRESSED,
            e -> System.out.println("Handler 3"));
    button.addEventFilter(MouseEvent.MOUSE_PRESSED,
            e -> System.out.println("Filter 4"));

とボタンにリスナーを登録しているので,コンソールには
    Filter 2
    Filter 4
    Handler 1
    Handler 3
と表示されるわけです.

自分自身,あまり DOM を分かってないのですが, Node の種類を増やしてった後でいろいろ試してみようかと思います.

7 件のコメント:

  1. TEN – titanium vs tungsten - the first metal engineering
    TEN – titanium versus tungsten · how much is titanium worth The original 2020 edge titanium TEN stainless mens titanium earrings steel T-25 was the TEN-25, ceramic vs titanium which thinkpad x1 titanium was manufactured in Japan. · The TEN-25 steel with three core parts

    返信削除
  2. n533s6bqhwt546 replica bags e736i2assya946

    返信削除