我在treeView上有以下cellValueFactory来添加contextMenu和dragAndDrop功能:
treeView.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {
@Override
public TreeCell<String> call(TreeView<String> stringTreeView) {
TreeCell<String> treeCell = new TreeCell<String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (!empty && item != null) {
setText(item);
setGraphic(getTreeItem().getGraphic());
final ContextMenu contextMenu = new ContextMenu();
MenuItem item2 = new MenuItem("Delete");
item2.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent e) {
System.out.println("Here I will add some delete functionality");
}
});
contextMenu.getItems().addAll(item2);
treeView.setContextMenu(contextMenu);
setContextMenu(contextMenu);
} else {
setText(null);
setGraphic(null);
}
}
};
addDragAndDrop(treeCell);
treeView.setEditable(true);
return treeCell;
}
});
拖放效果很好,contextMenu显示,但它显示在我在树视图中右键单击的所有内容。如何仅在用户实际右键单击树视图中的项目时才显示它?
答案 0 :(得分:1)
您在TreeView
和TreeCell
上设置了上下文菜单。只需在TreeCell
上设置即可。此外,如果单元格为空,则应将其删除:
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (!empty && item != null) {
setText(item);
setGraphic(getTreeItem().getGraphic());
final ContextMenu contextMenu = new ContextMenu();
MenuItem item2 = new MenuItem("Delete");
item2.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent e) {
System.out.println("Here I will add some delete functionality");
}
});
contextMenu.getItems().addAll(item2);
// remove this line:
//treeView.setContextMenu(contextMenu);
setContextMenu(contextMenu);
} else {
setText(null);
setGraphic(null);
setContextMenu(null);
}
}