5

treeView を使用してメニューを作成しようとしています。treeView を使用するのはこれが初めてで、いくつかの Web サイトで読んでいます。

アクションイベントに関しては、いくつか問題があります。私がやりたいことは、基本的に、ユーザーがツリービューのノードをクリックするたびに発生してイベントを発生させることです。これまでのところ、次のようになっています。

        TreeItem<String> rootItem = new TreeItem<String>("Navigation");
    TreeItem<String> statistics = new TreeItem<String>("Statistics");
    TreeItem<String> clan = new TreeItem<String>("Clan page");
    clan.addEventHandler(MouseEvent, new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {
            // TODO Auto-generated method stub

        }
    });

    rootItem.getChildren().add(statistics);
    rootItem.getChildren().add(clan);

    TreeView<String> tree = new TreeView<String>(rootItem); 

残念ながら、これはうまくいかないようです。

to タイプを変更せずに、個々のアイテムにaclicklistenerまたは anを追加する方法はありますか?actionlistenertreeViewtreeItemsButton

4

5 に答える 5

15

これは CellFactory を実装することで解決するかもしれませんが、簡単な方法は次のようになると思います。

1) イベント ハンドラーを作成して TreeView に追加します。

EventHandler<MouseEvent> mouseEventHandle = (MouseEvent event) -> {
    handleMouseClicked(event);
};

treeView.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventHandle); 

2)ノードのクリックのみを処理します(TreeViewの空のスペースではありません):

private void handleMouseClicked(MouseEvent event) {
    Node node = event.getPickResult().getIntersectedNode();
    // Accept clicks only on node cells, and not on empty spaces of the TreeView
    if (node instanceof Text || (node instanceof TreeCell && ((TreeCell) node).getText() != null)) {
        String name = (String) ((TreeItem)treeView.getSelectionModel().getSelectedItem()).getValue();
        System.out.println("Node click: " + name);
    }
}
于 2014-11-03T13:00:26.573 に答える
9

マウス イベントでメソッド getPickResult が見つからなかったので、Alex からの回答よりも次のほうが望ましいかもしれません。

1) リスナーをツリービューに追加

treeView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> handle(newValue));

2)クリックを処理します。空のスペースとノードのクリックを区別する必要はありません

private void updateSelectedItem(Object newValue) {      
    System.out.println(newValue);
}
于 2015-07-05T15:10:26.337 に答える
5

JavaFX 2.2のドキュメントによると:

「..a TreeItem はNodeではないため、TreeItem で発生するビジュアル イベントはありません。これらのイベントを取得するには、関連するオブザーバーを TreeCell インスタンスに (カスタム セル ファクトリ経由で) 追加する必要があります。」

この使用TreeViewは、何らかの形で役立つと思います。

于 2013-04-03T19:35:01.577 に答える