Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX2.0TreeView上下文菜单_Java_Treeview_Cell_Javafx 2 - Fatal编程技术网

JavaFX2.0TreeView上下文菜单

JavaFX2.0TreeView上下文菜单,java,treeview,cell,javafx-2,Java,Treeview,Cell,Javafx 2,我目前正在开发一个TreeView,希望实现一个右键单击TreeCell弹出的ContextMenu。我已经研究了这些例子,但我不确定如何将ContextMenu设置为在每个单元格上弹出,而不仅仅是那些充满了孩子的单元格 Here my code (pretty much the sample code): Constructor . . . this.setCellFactory(new Callback<TreeView<String>,TreeCell<Stri

我目前正在开发一个TreeView,希望实现一个右键单击TreeCell弹出的ContextMenu。我已经研究了这些例子,但我不确定如何将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();
        }
    }
}
这里是我的代码(基本上是示例代码):
建造师
.
.
.
this.setCellFactory(新回调()
{
@凌驾
公共TreeCell呼叫(TreeView p)
{
返回新的TextFieldTreeCellImpl();
}
});
}
私有最终类TextFieldTreeCellImpl扩展了TreeCell
{
私有文本字段文本字段;
private ContextMenu addMenu=新建ContextMenu();
@SuppressWarnings({“rawtypes”,“unchecked”})
公共文本字段treecellimpl()
{
MenuItem addMenuItem=新MenuItem(“添加注释”);
addMenu.getItems().add(addMenuItem);
addMenuItem.setOnAction(新的EventHandler()
{
公共无效句柄(事件t)
{
ImageView noteIcon=newImageView(新图像(getClass().getResourceAsStream(“../icons/note.png”));
注:图标设置高度(16);
noteIcon.setFitWidth(16);
TreeItem newNote=新TreeItem(“新注释”);
getTreeItem().getChildren().add(新注释);
}
});
}
@凌驾
公开作废已启动IT()
{
super.startEdit();
if(textField==null)
{
createTextField();
}
setText(空);
设置图形(文本字段);
textField.selectAll();
}
@凌驾
公共作废取消编辑()
{
super.cancelEdit();
setText((字符串)getItem());
setGraphic(getTreeItem().getGraphic());
}
@凌驾
public void updateItem(字符串项,布尔值为空)
{
super.updateItem(项,空);
if(空)
{
setText(空);
设置图形(空);
} 
其他的
{
if(isEditing())
{
if(textField!=null)
{
setText(getString());
}
setText(空);
设置图形(文本字段);
} 
其他的
{
setText(getString());
setGraphic(getTreeItem().getGraphic());
如果(!getTreeItem().isLeaf()&&getTreeItem().getParent()!=null)
{
setContextMenu(添加菜单);
}
}
}
}
私有void createTextField()
{
textField=newtextfield(getString());
setOnKeyReleased(新的EventHandler()
{
@凌驾
公共无效句柄(KeyEvent t)
{
if(t.getCode()==KeyCode.ENTER)
{
committedit(textField.getText());
} 
else if(t.getCode()==KeyCode.ESCAPE)
{
取消编辑();
}
}
});     
}
私有字符串getString()
{
返回getItem()==null?”:getItem().toString();
}
}
}
仅将contextMenu显示为“填充有子项”单元格由行控制:

if (!getTreeItem().isLeaf() && getTreeItem().getParent() != null) {
    setContextMenu(addMenu);
}
删除if控件,将上下文菜单弹出到所有节点/单元格