我试图在event.getSource().getGraphic()
的分支扩展事件中调用TreeItem
,以便我可以设置其他图标,但是我一直得到NullPointerException
,我不知道为什么。设置单元格工厂时,我可以成功设置图标,但是当我听分支扩展事件执行相同操作时,它将不起作用。这是我设置树的方法(通过控制器中的initialize事件):
tree.setCellFactory(param -> new TreeCell<File>() {
@Override
public void updateItem(File item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText("");
setGraphic(null);
} else {
setText(item.getName());
Image icon = new Image(getClass().getResourceAsStream("folder.png"));
setGraphic(new ImageView(icon));
}
}
});
这很好,花花公子。
这是我的事件侦听器,出于某些原因
ImageView
为null(也在我的TreeView
控制器的initialize事件中添加):File home = new File(System.getProperty("user.home"));
TreeItem<File> root = new TreeItem<>(home);
tree.setRoot(root);
root.addEventHandler(TreeItem.branchExpandedEvent(), event -> {
TreeItem source = event.getSource();
ImageView img = (ImageView)source.getGraphic(); // this is null!
Image icon = Image(getClass().getResourceAsStream("folder-open.png"));
img.setImage(icon);
});
有人知道我在做什么错吗?我正在使用Java 1.8。
最佳答案
您正在访问的是graphic
的TreeItem
属性,而不是设置为!= graphic
的TreeCell
的null
属性。您需要在TreeCell
中进行处理。此外,您可能应该使用disclosureNode
属性替换箭头。另外,最好重用Image
:
final Image closedImage = new Image(getClass().getResourceAsStream("folder.png"));
final Image openImage = new Image(getClass().getResourceAsStream("folder-open.png"));
tree.setCellFactory(param -> new TreeCell<File>() {
{
final ImageView imageView = new ImageView();
imageView.setFitWidth(20);
imageView.setFitHeight(20);
final ChangeListener<Boolean> expansionListener = new WeakChangeListener<>((o, oldValue, newValue) -> {
imageView.setImage(newValue ? openImage : closedImage);
});
// add change listener to expanded property of item
treeItemProperty().addListener((o, oldValue, newValue) -> {
if (oldValue != null) {
oldValue.expandedProperty().removeListener(expansionListener);
}
if (newValue != null) {
newValue.expandedProperty().addListener(expansionListener);
expansionListener.changed(null, null, newValue.isExpanded()); // trigger for initial value
}
});
setDisclosureNode(imageView);
}
@Override
public void updateItem(File item, boolean empty) {
super.updateItem(item, empty);
setText((empty || item == null) ? "" : item.getName());
}
});