【问题标题】:right click menu option in the tree root node树根节点中的右键菜单选项
【发布时间】:2013-08-14 22:53:37
【问题描述】:

我想在树根节点 (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")
);

【问题讨论】:

    标签: treeview javafx-2 right-click


    【解决方案1】:

    您可以分两步执行所需的行为:

    1. 在您的 TreeView 上定义自定义 TreeCell 工厂;
    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 tutorial 以查看与此 JavaFX 控件相关的其他用途和示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      相关资源
      最近更新 更多