2

ツリーのルート ノード(JavaFX)で右クリック メニュー オプションが必要です。誰でもこれについて私を助けることができますか?

TreeItem<String> root = new TreeItem<>(""+selectedDirectory);
root.setExpanded(true);

locationTreeView.setRoot(root);

root.getChildren().addAll(
    new TreeItem<>("Item 1"),
    new TreeItem<>("Item 2"),
    new TreeItem<>("Item 3")
);
4

1 に答える 1

8

次の 2 つの手順で目的の動作を実行できます。

  1. でカスタムTreeCellファクトリを定義するTreeView
  2. TreeCellルート ツリー アイテムにコンテキスト メニューを追加します。

次のコードは、カスタムTreeCellファクトリを定義します。

// defines a custom tree cell factory for the tree view
tree.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {

    @Override
    public TreeCell<String> call(TreeView<String> arg0) {
        // custom tree cell that defines a context menu for the root tree item
        return new MyTreeCell();
    }
});

また、ルート ツリー項目のコンテキスト メニューをアタッチするカスタム ツリー セルの実装を次に示します。

class MyTreeCell extends TextFieldTreeCell<String> {
    private ContextMenu rootContextMenu;

    public MyTreeCell() {
        // instantiate the root context menu
        rootContextMenu = 
            ContextMenuBuilder.create()
                .items(
                        MenuItemBuilder.create()
                            .text("Menu Item")
                            .onAction(
                                new EventHandler<ActionEvent>() {
                                    @Override
                                    public void handle(ActionEvent arg0) {
                                        System.out.println("Menu Item Clicked!");                                           
                                    }
                                }
                            )
                            .build()
                    )
                .build();
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        // if the item is not empty and is a root...
        if (!empty && getTreeItem().getParent() == null) {
            setContextMenu(rootContextMenu);
        }
    }
}

次の例は、セル ファクトリとカスタム セルの両方を一緒に使用する方法を示しています。

public class TreeViewWithContextMenuOnRoot extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Tree with context menu on root");        

        TreeItem<String> rootItem = new TreeItem<String> ("Tree root");
        rootItem.setExpanded(true);
        for (int i = 1; i < 3; i++) {
            TreeItem<String> item = new TreeItem<String> ("item" + i);            
            rootItem.getChildren().add(item);
        }        
        final TreeView<String> tree = new TreeView<String> ();   

        tree.setRoot(rootItem);

        // defines a custom tree cell factory for the tree view
        tree.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {

            @Override
            public TreeCell<String> call(TreeView<String> arg0) {
                // custom tree cell that defines a context menu for the root tree item
                return new MyTreeCell();
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(tree);
        primaryStage.setScene(new Scene(root, 200, 100));
        primaryStage.show();
    }

    private static class MyTreeCell extends TextFieldTreeCell<String> {
        private ContextMenu rootContextMenu;

        public MyTreeCell() {
            // instantiate the root context menu
            rootContextMenu = 
                ContextMenuBuilder.create()
                    .items(
                            MenuItemBuilder.create()
                                .text("Menu Item")
                                .onAction(
                                    new EventHandler<ActionEvent>() {
                                        @Override
                                        public void handle(ActionEvent arg0) {
                                            System.out.println("Menu Item Clicked!");                                           
                                        }
                                    }
                                )
                                .build()
                        )
                    .build();
        }

        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);

            // if the item is not empty and is a root...
            if (!empty && getTreeItem().getParent() == null) {
                setContextMenu(rootContextMenu);
            }
        }
    }
}

TreeViewチュートリアルを見て、この JavaFX コントロールに関連する他の使用法と例を確認できます。

于 2013-08-19T15:37:24.197 に答える