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

时间:2015-05-29 01:06:55

标签: javafx treeview javafx-8

我有一个TreeView,有很多TreeItem。我想要做的是我启用对所选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做到这一点? 有什么帮助吗?

1 个答案:

答案 0 :(得分:3)

我认为你说你想要一些单元格可以编辑,有些单元格不可编辑,这取决于它们显示的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 ;
});