2013年1月27日日曜日

TreeItemを開くときと閉じるときのイベント処理

TreeViewの中のTreeItemが開いたときと閉じたときのイベント処理を書いてみた.
まずは,EventHandlerインターフェースを継承して,イベントハンドラを作る.
開くときのイベントは,TreeItemにbranchExpandedEventというのがあったので,
それかどうかを判定してみる.閉じるときのイベントはbranchCollapsedEventらしい.

import java.io.File;
import javafx.event.EventHandler;
import javafx.scene.control.TreeItem;

public class FileTreeModificationEventHandler
    implements EventHandler<
        TreeItem.TreeModificationEvent<File>>
{
    public void handle(
        TreeItem.TreeModificationEvent<File>
        event
    )
    {
        if(event.getEventType() ==
            TreeItem.<File>branchExpandedEvent())
        {
            System.out.println("expanded");
        }else if(event.getEventType() ==
            TreeItem.<File>branchCollapsedEvent())
        {
            System.out.println("collapsed");
        }
    }
}

これを,前に作ったFileTreeItemのコンストラクタで登録させる.

    public FileTreeItem(final File f){
        super(f);

        // 開くときのイベントを登録
        addEventHandler(
            TreeItem.<File>branchExpandedEvent(),
            new FileTreeModificationEventHandler());
        // 閉じるときのイベントを登録
        addEventHandler(
            TreeItem.<File>branchCollapsedEvent(),
            new FileTreeModificationEventHandler());
    }

これで,開いたり閉じたりする度にexpandedやcollapsedが表示される.
ただ,これだと木の奥の方に行くほど何度もexpandedが表示されるので,
イベントを一回処理したら終わりにしてみる.

    public void handle(
        TreeItem.TreeModificationEvent<File>
        event
    )
    {
        if(event.getEventType() ==
            TreeItem.<File>branchExpandedEvent())
        {
            System.out.println("expanded");
            event.consume();
        }else if(event.getEventType() ==
            TreeItem.<File>branchCollapsedEvent())
        {
            System.out.println("collapsed");
            event.consume();
        }
    }

Eventのconsumeを呼び出すと,その後のイベントが伝わっていくのを抑えられる.
で,抑えてみた結果を実行すると,木が開かなくなった.expandedの方のconsumeを
消すと,今度は開くけど閉じることが出来なくなった.どうもイベントは木の根から
呼び出されていくらしい.イベントの発生源から親に向かって呼び出されていくと思っていた.
イベントのハンドラは根にだけ登録して,getSource()で処理する感じになるのかな.

で,これ書くときに一番引っかかったのがジェネリクスに対応した
staticメソッドを呼び出すときは,クラス名. の後に型名を書くということ.
クラス名に型名を指定していてずっと引っかかっていた.
Javaのジェネリクスちゃんと勉強しないとなぁ.

0 件のコメント:

コメントを投稿