gpt4 book ai didi

java - TreeItem.branchExpandedEvent() 中的 NullPointerException 尝试 getGraphic

转载 作者:行者123 更新时间:2023-12-02 02:06:36 25 4
gpt4 key购买 nike

我试图在 TreeItem 的分支扩展事件中调用 event.getSource().getGraphic() ,以便我可以设置不同的图标,但是我不断收到 NullPointerException,但我不明白为什么。我可以在设置单元工厂时成功设置图标,但是当我监听分支扩展事件以执行相同操作时,它不起作用。以下是我设置树的方法(来自 Controller 中的初始化事件):

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 Controller 的初始化事件中):

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。

最佳答案

您正在访问 TreeItemgraphic 属性,而不是访问 TreeCellgraphic 属性设置为一个值!= 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());
}
});

关于java - TreeItem.branchExpandedEvent() 中的 NullPointerException 尝试 getGraphic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50673607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com