我知道TreeCell
对象是通过TreeView
使用单元工厂动态生成的。
有没有办法获取TreeCell
当前存在的所有对象的列表?
我想我可以通过修改单元工厂来跟踪它们。如,每当我创建一个新单元格时,将其添加到某个列表中。但是后来我不确定如何在 TreeView 处理单元格后从我的列表中删除它们(因为它们不在视野范围内)。
我对此的解决方案是使用弱引用:
[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
将始终包含当前存在的 TreeCell。
还有另一个非常丑陋的解决方案,使用反射来获取 TreeCells 列表。请注意,据我所知,此列表是 JavaFX 的 TreeCell 列表在某个时间点的快照。它没有得到支持。
@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 的节点。