在JavaFXTreeView中编辑项

在JavaFXTreeView中编辑项,javafx,javafx-2,javafx-8,Javafx,Javafx 2,Javafx 8,我有这个自定义树视图代码: treeView.setCellFactory(new Callback<TreeView<Tree>, TreeCell<Tree>>() { @Override public TreeCell<Tree> call(TreeView<Tree> treeView) { final Tre

我有这个自定义树视图代码:

treeView.setCellFactory(new Callback<TreeView<Tree>, TreeCell<Tree>>()
        {
            @Override
            public TreeCell<Tree> call(TreeView<Tree> treeView)
            {
                final TreeCell<Tree> cell = new TreeCell<Tree>()
                {
                    @Override
                    protected void updateItem(Tree item, boolean empty)
                    {
                        super.updateItem(item, empty);
                        if (!empty)
                        {
                            setText(item != null ? item.toString() : "");
                            setGraphic(createImageView(item));
                            setContextMenu(createContextMenuTreeItem(item));
                        }
                        else
                        {
                            setText(null);
                            setGraphic(null);
                            setContextMenu(null);
                        }
                    }
                };

                return cell;
            }
        });
treeView.setCellFactory(新回调()
{
@凌驾
公共TreeCell呼叫(TreeView TreeView)
{
最终TreeCell单元=新TreeCell()
{
@凌驾
受保护的void updateItem(树项,布尔值为空)
{
super.updateItem(项,空);
如果(!空)
{
setText(item!=null?item.toString():“”);
setGraphic(createImageView(项目));
setContextMenu(createContextMenuTreeItem(item));
}
其他的
{
setText(空);
设置图形(空);
setContextMenu(空);
}
}
};
返回单元;
}
});

我希望能够使用内容菜单重命名树的节点。您能帮我实现吗?

您只需在MenuItem的EventHandler中开始编辑树节点即可。下面是一个示例代码,它允许通过双击(我没有尝试更改/阻止)和上下文菜单进行基本编辑:

import javafx.application.Application;
import javafx.event.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.TextFieldTreeCell;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.*;
import javafx.util.converter.DefaultStringConverter;

public class TreeViewSample extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Tree View Sample");

        TreeItem<String> rootItem = new TreeItem<String> ("Tree");
        rootItem.setExpanded(true);
        for (int i = 1; i < 6; i++) {
            TreeItem<String> item = new TreeItem<String> ("Item" + i);
            rootItem.getChildren().add(item);
        }

        TreeView<String> tree = new TreeView<String> (rootItem);
        tree.setEditable(true);
        tree.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
            @Override
            public TreeCell<String> call(TreeView<String> p) {
                return new RenameMenuTreeCell();
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(tree);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

    private static class RenameMenuTreeCell extends TextFieldTreeCell<String> {
        private ContextMenu menu = new ContextMenu();

        public RenameMenuTreeCell() {
            super(new DefaultStringConverter());

            MenuItem renameItem = new MenuItem("Rename");
            menu.getItems().add(renameItem);
            renameItem.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent arg0) {
                    startEdit();
                }
            });
        }

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

            if (!isEditing()) {
                setContextMenu(menu);
            }
        }
    }
}
导入javafx.application.application;
导入javafx.event.*;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.control.cell.TextFieldTreeCell;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
导入javafx.util.*;
导入javafx.util.converter.DefaultStringConverter;
公共类TreeViewSample扩展了应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
setTitle(“树视图示例”);
TreeItem rootItem=新的TreeItem(“树”);
setExpanded(true);
对于(int i=1;i<6;i++){
TreeItem=新的TreeItem(“项目”+i);
rootItem.getChildren().add(项);
}
TreeView树=新的TreeView(rootItem);
tree.setEditable(true);
setCellFactory(新回调(){
@凌驾
公共TreeCell呼叫(TreeView p){
返回新的RenamementRetreeCell();
}
});
StackPane root=新的StackPane();
root.getChildren().add(树);
原始阶段。设置场景(新场景(根,300250));
primaryStage.show();
}
私有静态类RenamementReecell扩展了TextFieldTreeCell{
私有上下文菜单=新建上下文菜单();
公共RenamementRetreeCell(){
超级(新的DefaultStringConverter());
MenuItem Rename Item=新MenuItem(“重命名”);
menu.getItems().add(重命名项);

重命名em.setOnAction(带有自定义树单元格的新EventHandler。

这确实需要更多信息。如果您想使用上下文菜单重命名这些单元格,您可能有一组固定的名称可供选择。这些名称是什么?如何实现您的
类?它可能有助于显示您尝试过的内容、您希望它做什么以及它是如何实现的行为与您的预期不同。以下是我正在使用的示例。您想要一个带有“重命名”项操作的上下文菜单,允许您重命名节点?您不需要只单击该项并开始编辑。当我用鼠标双击时,我想触发其他事件。在我的情况下,我需要使用内容菜单来执行此操作。