Получить список всех объектов 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.