Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取当前存在于TreeView中的所有TreeCell对象的列表_Java_Javafx_Treeview_Treecell - Fatal编程技术网

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");