Java 获取当前存在于TreeView中的所有TreeCell对象的列表
我知道Java 获取当前存在于TreeView中的所有TreeCell对象的列表,java,javafx,treeview,treecell,Java,Javafx,Treeview,Treecell,我知道TreeCell对象是由TreeView使用单元格工厂动态生成的 是否有方法获取当前存在的所有TreeCell对象的列表 我想我可以通过修改细胞工厂来跟踪他们。如中所示,每当我创建新单元格时,都会将其添加到某个列表中。但是,一旦TreeView处理了单元格,我就不知道如何从列表中删除它们(因为它们不在视图中)。我的解决方案是使用: [A] 弱引用是不保护被引用对象不被垃圾收集器收集的引用[。] 因此,将其添加到控制器: private final Set<MyTreeCell>
TreeCell
对象是由TreeView
使用单元格工厂动态生成的
是否有方法获取当前存在的所有TreeCell
对象的列表
我想我可以通过修改细胞工厂来跟踪他们。如中所示,每当我创建新单元格时,都会将其添加到某个列表中。但是,一旦TreeView处理了单元格,我就不知道如何从列表中删除它们(因为它们不在视图中)。我的解决方案是使用: [A] 弱引用是不保护被引用对象不被垃圾收集器收集的引用[。] 因此,将其添加到控制器:
private final Set<MyTreeCell> myTreeCells = Collections.newSetFromMap(new WeakHashMap<>());
现在,myTreeCells
将始终包含当前存在的TreeCells
更新
还有另一个非常丑陋的解决方案,使用反射来获取树单元列表。请注意,据我所知,这个列表是某个时间点上JavaFXs树单元列表的快照。它没有得到支持
@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;
}
@SuppressWarnings({“unchecked”})
私有集getListOfTreeCells(){
试一试{
最终字段f=VirtualContainerBase.class.getDeclaredField(“流”);
f、 setAccessible(true);
final字段g=VirtualFlow.class.getDeclaredField(“单元格”);
g、 setAccessible(true);
最终集s=新的HashSet();
s、 addAll((ArrayLink列表)g
.get((f.get((myTreeView.skinProperty().get()));
返回s;
}
catch(NoSuchFieldException | SecurityException | IllegalArgumentException
|非法访问(例外e){
e、 printStackTrace();
}
返回null;
}
这将返回一组可以强制转换为TreeCells的节点。简言之,不,没有(至少在公共API中没有)。你觉得你为什么要这么做?(请注意,当它们离开视图时,它们通常会被重用,而不是被丢弃,但这两者都不能保证。)@James_D有时,我的应用程序需要根据许多因素更改树视图中所有单元格的样式(字体/颜色/等)。这对于新生成的单元格没有问题,因为我可以使用所需的样式生成它们,但是对于旧的现有单元格,它们将保留创建时的样式,并且需要以某种方式进行更新。因此,您的问题是:“当单元格显示后属性发生更改时,如何动态更新
TreeCell
的样式?“。保留单元格列表不是这样做的方法:您应该让单元格工厂生成具有适当属性的单元格。我建议你修改你的问题,改为问这个。。。添加一些代码可能会有所帮助。事实上:如果您要更改所有单元格的样式,只需更改TreeView
本身上的样式类,然后使用CSS文件将样式应用于作为TreeView
不同类的子节点的单元格即可。但是你需要解释一下你到底想做什么。哈哈哈,伙计,我喜欢反射示例xD,我觉得javafx迫使你做这样的事情,因为他们的设计选择很差。事实上,仅仅为树上的物品设计样式是如此的困难,这真是令人沮丧。谢谢你,伙计,这很有魅力。我认为这是最好的解决办法。
@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");