JavaFX - 如何为特定的 TreeItem 设置 CellFactory

JavaFX - how to set CellFactory for specific TreeItem

我有一个 TreeView,有很多 TreeItem。我想要做的是为选定的 TreeItem 启用修改并为其他人禁用它。 为了让所有 TreeView 都可以修改,我使用:

    syTree.setEditable(true);
    syTree.setCellFactory(TextFieldTreeCell.forTreeView());

        }

        syTree.setOnEditCommit(new EventHandler<TreeView.EditEvent<String>>() {
            @Override
            public void handle(TreeView.EditEvent<String> t) {      

syTree.getRoot().getChildren().set(syTree.getRow(t.getTreeItem()), new TreeItem<String>(t.getNewValue()));
                System.out.println("setOnEditCommit");
                //}
            }

        });
        syTree.setOnEditCancel(new EventHandler<TreeView.EditEvent<String>>() {
                @Override
                public void handle(TreeView.EditEvent<String> t) {
                    System.out.println("setOnEditCancel");
                }
            });

此行只是在尝试修改时将所有 TreeItems 更改为 TextField: syTree.setCellFactory(TextFieldTreeCell.forTreeView()); 如何针对特定的 TreeItem 执行此操作? 有什么帮助吗?

我想您是说您希望某些单元格可编辑,而某些单元格不可编辑,具体取决于它们显示的 TreeItem 的某些条件。如果是这样,那是有可能的,你只需要对你的细胞工厂多做一点工作:

Callback<TreeView<String>, TreeCell<String>> defaultCellFactory = TextFieldTreeCell.forTreeView();

syTree.setCellFactory((TreeView<String> tv) -> {
    TreeCell<String> cell = defaultCellFactory.call(tv);
    cell.treeItemProperty().addListener((obs, oldTreeItem, newTreeItem) -> {
        if (newTreeItem == null) {
            cell.setEditable(false);
        } else if ( /* newTreeItem should be editable */) {
            cell.setEditable(true);
        } else {
            cell.setEditable(false);
        }
    });
    return cell ;
});