Получить список всех объектов TreeCell, которые в настоящее время существуют в TreeView

Я знаю это TreeCell объекты генерируются динамически TreeView используя фабрику клеток.

Есть ли способ получить список всех TreeCell объекты, которые в настоящее время существуют?

Полагаю, я мог бы отслеживать их, изменяя фабрику ячеек. Например, всякий раз, когда я создаю новую ячейку, добавляю ее в какой-то список. Но тогда я не уверен, как удалить ячейки из моего списка, как только TreeView удалит их (потому что они исчезли из поля зрения).

2 ответа

Мое решение этого заключается в использовании слабых ссылок:

[A] слабая ссылка - это ссылка, которая не защищает указанный объект от сбора сборщиком мусора [.]

Итак, добавьте это в свой контроллер:

private final Set<MyTreeCell> myTreeCells = Collections.newSetFromMap(new WeakHashMap<>());

И сделайте так, чтобы ваш CellFactory выглядел так:

myTreeView.setCellFactory((treeItem) -> {
        MyTreeCell c = new MyTreeCell(icf);
        Platform.runLater(() -> myTreeCells.add(c));
        return c;
    });

Сейчас, myTreeCells всегда будет содержать существующие в настоящий момент TreeCells.

Обновить

Есть еще одно, довольно уродливое решение, использующее отражение для получения списка TreeCells. Обратите внимание, что этот Список - насколько я знаю - снимок списка JavaFXs TreeCells в какой-то момент времени. Это не поддерживается.

@SuppressWarnings({ "unchecked" })
private Set<MyTreeCell> getListOfTreeCells() {
    try {
        final Field f = VirtualContainerBase.class.getDeclaredField("flow");
        f.setAccessible(true);
        final Field g = VirtualFlow.class.getDeclaredField("cells");
        g.setAccessible(true);
        final Set<MyTreeCell> s = new HashSet<>();
        s.addAll((ArrayLinkedList<MyTreeCell>) g
                .get((f.get((myTreeView.skinProperty().get())))));
        return s;
    }
    catch (NoSuchFieldException | SecurityException | IllegalArgumentException
            | IllegalAccessException e) {
        e.printStackTrace();
    }
    return null;
}
treeView.lookupAll(".tree-cell");

Это вернет набор узлов, которые можно привести к TreeCells.

Другие вопросы по тегам