Javafx 使用cell factory定制TreeCells

Javafx 使用cell factory定制TreeCells,javafx,fxml,Javafx,Fxml,我试图代表这样一个TreeCell: 我试过阅读有关细胞工厂的资料,我知道我必须使用这个功能。但是我怎样才能为所有的TreeCells设置这样的图形呢?图像作为HBox存储在.fxml文件中 非常感谢你: 另外,不一定要在这里的答案中寻找代码,更多的是关于如何做或为什么不工作的一般性解释 这是我尝试过的代码。fxml文件与该文件位于同一文件夹中 这是我得到的错误代码: 线程JavaFX应用程序线程java.lang.NullPointerException中出现异常:需要位置 @Over

我试图代表这样一个TreeCell:

我试过阅读有关细胞工厂的资料,我知道我必须使用这个功能。但是我怎样才能为所有的TreeCells设置这样的图形呢?图像作为HBox存储在.fxml文件中

非常感谢你:

另外,不一定要在这里的答案中寻找代码,更多的是关于如何做或为什么不工作的一般性解释

这是我尝试过的代码。fxml文件与该文件位于同一文件夹中

这是我得到的错误代码:

线程JavaFX应用程序线程java.lang.NullPointerException中出现异常:需要位置

    @Override
public void updateItem(String item, boolean empty) {
   super.updateItem(item, empty);
    try {
        this.hBox = (HBox) FXMLLoader.load(getClass().getResource("/Views/TreeCell.fxml"));
    } catch (IOException e) {
        System.out.println("This didn't work");
        e.printStackTrace();
    }
    if (item != null) {
        setGraphic(this.hBox);
    } else {
        setGraphic(null);
    }
}

您得到的异常仅仅意味着FXMLLoader无法找到您指定的FXML文件。如果FXML文件与当前类位于同一个包中,则应该能够使用

    this.hBox = (HBox) FXMLLoader.load(getClass().getResource("TreeCell.fxml"));
如果以前导/开始资源路径,它将被解释为相对于类路径

使用您显示的代码,性能可能非常差。当使用单元工厂时,单元的创建相对较少,但它们的updateItem。。。方法可以非常频繁地调用,特别是在快速滚动期间,或者在展开和折叠树节点时。用这种方法读取和解析FXML文件可能不是一个好主意

相反,您可以在创建单元格时读取一次文件,然后在updateItem方法中重用生成的HBox:


谢谢文件路径有问题。感谢您的建议,让它运行得更快。我将代码更改为类似于您发布的内容,在CustomTreeCell构造函数中加载FXML。
tree.setCellFactory(treeView -> {
    HBox hbox ;
    try {
        hbox = (HBox) FXMLLoader.load(getClass().getResource("TreeCell.fxml"));
    } catch (Exception exc) {
        throw new RuntimeException(exc) ;
    }
    return new TreeCell<String>() {
        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (item == null) {
                setGraphic(null);
            } else {
                // configure graphic with cell data etc...
                setGraphic(hbox);
            }
        }
    };
});