NullPointerException в TreeItem.branchExpandedEvent () при попытке получить графический - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь вызвать event.getSource().getGraphic() в расширенном событии ветви TreeItem, чтобы я мог установить другую иконку, но я продолжаю получать NullPointerException, и я не могу понять, почему.Я могу успешно установить значок при настройке фабрики ячеек, но когда я слушаю, что событие в расширенном филиале делает то же самое, оно не работает.Вот как я настраиваю дерево (из события инициализации в моем контроллере):

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 по какой-то причине равен нулю (также добавляется в событие инициализации в моем TreeView контроллере):

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.

1 Ответ

0 голосов
/ 04 июня 2018

Вы получаете доступ к свойству graphic TreeItem, а не к свойству graphic TreeCell, для которого установлено значение! = null.Вы должны обработать это в TreeCell вместо этого.Кроме того, вам, вероятно, следует использовать свойство disclosureNode для замены стрелки.Также лучше использовать Image s:

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());
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...