JavaFX 2.0 TreeView 上下文菜单

标签 java treeview cell javafx-2

我目前正在研究 TreeView,并希望实现一个右键单击 TreeCell 时弹出的 ContextMenu。我研究了这些示例,但我不确定如何将上下文菜单设置为在每个单元格上弹出,而不仅仅是那些充满 child 的单元格。

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();
        }
    }
}

最佳答案

显示 contextMenu 到“充满 child ”的单元格仅由线条控制:

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

删除 if 控件以将 contextMenu 弹出到所有节点/单元格。

关于JavaFX 2.0 TreeView 上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11282136/

相关文章:

rotation - 将段落或单元格旋转任意度数——Itext

java - 多个程序访问同一个 mySQL 数据库

c# - asp.net TreeView 中的 OnSelectedNodeChanged 事件不起作用

java - 配置扫描本地文件系统的 TreeView 以仅包含具有文件类型的文件夹

Excel 公式显示链接的单元格 ID

swift - 将文本大小设置为与最近通话联系人姓名相同的大小

java - 如何在 Java 中轻松更改 XML 文档的文档类型?

java - 如何使用 Java 中的模式匹配器类从给定的字符串中查找匹配的两个或多个单词?

Javassist:javassist.CannotCompileException:由java.lang.ClassFormatError:类文件中的方法名称和签名重复

c# - 选择项目时如何避免winforms treeview图标发生变化