![](/img/trans.png)
[英]Hibernate: how to get a list of all the objects currently in the session
[英]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.