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