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

时间:2015-09-01 15:04:18

标签: java javafx treeview treecell

我知道01 12 * * * /usr/bin/supervisorctl restart {instance name} 对象是由TreeCell使用单元工厂动态生成的。

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

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

2 个答案:

答案 0 :(得分:1)

我的解决方法是使用weak references

  

[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。

更新

使用反射来获取TreeCell列表还有另一种非常难看的解决方案。请注意,就我所知,此List是一个时间点的JavaFXs 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;
}

答案 1 :(得分:0)

treeView.lookupAll(".tree-cell");

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