我试图像这样代表一个TreeCell:
http://i.imgur.com/wv00CEi.png
我试过阅读细胞工厂,我知道我必须使用这个功能。但是如何为所有TreeCells设置图形呢?图像作为HBox存储在.fxml文件中。
非常感谢你:)
P.S。不一定在这里寻找答案中的代码,更多关于如何做到这一点的一般解释或为什么它不起作用。
这是我尝试过的代码。 fxml文件与文件位于同一文件夹中。
这是我得到的错误代码:
线程“JavaFX Application Thread”中的异常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);
}
}
答案 0 :(得分:2)
您获得的例外意味着FXMLLoader
无法找到您指定的FXML文件。如果FXML文件与当前类位于同一个包中,则应该能够使用
this.hBox = (HBox) FXMLLoader.load(getClass().getResource("TreeCell.fxml"));
如果您使用前导/
启动资源路径,它将被解释为相对于类路径。
使用您显示的代码,性能可能会非常差。使用单元工厂时,相对很少创建单元格,但可能会非常频繁地调用它们的updateItem(...)
方法(特别是在快速滚动期间,或者在展开和折叠树节点时)。在该方法中阅读和解析FXML文件可能是一个坏主意。
相反,您可以在创建单元格时读取文件一次,然后只需在HBox
方法中重复使用生成的updateItem()
:
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);
}
}
};
});