簡體   English   中英

獲取TreeView中當前存在的所有TreeCell對象的列表

[英]Get a list of all TreeCell objects that currently exist in a TreeView

我知道TreeCell對象是由TreeView使用單元工廠動態生成的。

有沒有辦法獲取當前存在的所有TreeCell對象的列表?

我想我可以通過修改單元工廠來跟蹤它們。 與之類似,每當我創建一個新單元格時,將其添加到某個列表中。 但是然后我不確定在TreeView放置它們后如何從列表中刪除它們(因為它們不在視野內)。

我對此的解決方案是使用弱引用

[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將始終包含當前存在的TreeCells。

更新

還有另一個非常丑陋的解決方案,使用反射來獲取TreeCells列表。 請注意,據我所知,該列表是某個時刻的JavaFXs 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;
}
treeView.lookupAll(".tree-cell");

這將返回可以轉換為TreeCells的一組節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM