gpt4 book ai didi

java - 获取 TreeView 中当前存在的所有 TreeCell 对象的列表

转载 作者:行者123 更新时间:2023-11-30 07:58:15 24 4
gpt4 key购买 nike

我知道 TreeCell 对象是由 TreeView 使用单元工厂动态生成的。

有没有办法获取当前存在的所有 TreeCell 对象的列表?

我想我可以通过修改细胞工厂来跟踪它们。就像这样,每当我创建一个新单元格时,将其添加到某个列表中。但是,一旦 TreeView 处理掉单元格(因为它们超出了 View 范围),我就不确定如何从列表中删除单元格。

最佳答案

我的解决方案是使用 weak references :

[A] weak reference is a reference that does not protect the referenced object from collection by a garbage collector[.]

因此,将其添加到您的 Controller 中:

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 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;
}

关于java - 获取 TreeView 中当前存在的所有 TreeCell 对象的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32335015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com