1

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

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

我想我可以通过修改单元工厂来跟踪它们。如,每当我创建一个新单元格时,将其添加到某个列表中。但是后来我不确定如何在 TreeView 处理单元格后从我的列表中删除它们(因为它们不在视野范围内)。

4

2 回答 2

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将始终包含当前存在的 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;
}
于 2016-02-01T01:56:56.917 回答
1
treeView.lookupAll(".tree-cell");

这将返回一组可以转换为 TreeCells 的节点。

于 2016-03-31T14:46:09.210 回答