我试图在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。

最佳答案

您正在访问的是graphicTreeItem属性,而不是设置为!= graphicTreeCellnull属性。您需要在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());
    }
});

09-05 02:03