JavaFX2.0TreeView上下文菜单
我目前正在开发一个TreeView,希望实现一个右键单击TreeCell弹出的ContextMenu。我已经研究了这些例子,但我不确定如何将ContextMenu设置为在每个单元格上弹出,而不仅仅是那些充满了孩子的单元格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
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控件,将上下文菜单弹出到所有节点/单元格