JavaFX 2.0 树形视图上下文菜单

3

我目前正在开发一个TreeView并想添加一个右键菜单,用于在TreeCell上右击时弹出。我已经研究了示例,但我不确定如何将ContextMenu设置为在每个单元格上弹出,而不仅仅是填充有子节点的单元格。

Here my code (pretty much the sample code):

Constructor
.
.
.

this.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>()
    {
            @Override
            public TreeCell<String> call(TreeView<String> p) 
            {
                return new TextFieldTreeCellImpl();
            }
        });
    }

    private final class TextFieldTreeCellImpl extends TreeCell<String> 
    {

        private TextField textField;
        private ContextMenu addMenu = new ContextMenu();

        @SuppressWarnings({ "rawtypes", "unchecked" })
    public TextFieldTreeCellImpl() 
        {
            MenuItem addMenuItem = new MenuItem("Add Note");
            addMenu.getItems().add(addMenuItem);
            addMenuItem.setOnAction(new EventHandler() 
            {
                public void handle(Event t) 
                {
                    ImageView noteIcon = new ImageView(new Image(getClass().getResourceAsStream("../icons/note.png")));
            noteIcon.setFitHeight(16);
            noteIcon.setFitWidth(16);

                    TreeItem newNote = new TreeItem<String>("New Note");
                    getTreeItem().getChildren().add(newNote);
                }
            });
        }

        @Override
        public void startEdit() 
        {
            super.startEdit();

            if (textField == null) 
            {
                createTextField();
            }
            setText(null);
            setGraphic(textField);
            textField.selectAll();
        }

        @Override
        public void cancelEdit() 
        {
            super.cancelEdit();

            setText((String) getItem());
            setGraphic(getTreeItem().getGraphic());
        }

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

            if (empty) 
            {
                setText(null);
                setGraphic(null);
            } 
            else
            {
                if (isEditing()) 
                {
                    if (textField != null) 
                    {
                        textField.setText(getString());
                    }
                    setText(null);
                    setGraphic(textField);
                } 
                else 
                {
                    setText(getString());
                    setGraphic(getTreeItem().getGraphic());
                    if (!getTreeItem().isLeaf()&&getTreeItem().getParent()!= null)
                    {
                        setContextMenu(addMenu);
                    }
                }
            }
        }

        private void createTextField() 
        {
            textField = new TextField(getString());
            textField.setOnKeyReleased(new EventHandler<KeyEvent>() 
            {
                @Override
                public void handle(KeyEvent t) 
                {
                    if (t.getCode() == KeyCode.ENTER) 
                    {
                        commitEdit(textField.getText());
                    } 
                    else if (t.getCode() == KeyCode.ESCAPE) 
                    {
                        cancelEdit();
                    }
                }
            });     
        }

        private String getString() 
        {
            return getItem() == null ? "" : getItem().toString();
        }
    }
}
1个回答

2

仅向“填充有子项”的单元格显示上下文菜单,可以通过以下代码进行控制:

if (!getTreeItem().isLeaf() && getTreeItem().getParent() != null) {
    setContextMenu(addMenu);
}

如果需要弹出上下文菜单到所有节点/单元格,请删除控件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接