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

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

  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 回答