Próbowałem rozwiązania, ty też używasz.
Po mojej opinii przedstawiony tam kod nie jest optymalny: - wywołuje tree.expandPath dla wszystkich węzłów, zamiast wywoływać go tylko dla najgłębszych węzłów niebędących liśćmi (wywoływanie expandPath na węzłach liści nie ma żadnego efektu, zobacz JDK)
Oto poprawiona wersja, która powinna być szybsza:
// If expand is true, expands all nodes in the tree.
// Otherwise, collapses all nodes in the tree.
public void expandAll(JTree tree, boolean expand) {
TreeNode root = (TreeNode)tree.getModel().getRoot();
if (root!=null) {
// Traverse tree from root
expandAll(tree, new TreePath(root), expand);
}
}
/**
* @return Whether an expandPath was called for the last node in the parent path
*/
private boolean expandAll(JTree tree, TreePath parent, boolean expand) {
// Traverse children
TreeNode node = (TreeNode)parent.getLastPathComponent();
if (node.getChildCount() > 0) {
boolean childExpandCalled = false;
for (Enumeration e=node.children(); e.hasMoreElements();) {
TreeNode n = (TreeNode)e.nextElement();
TreePath path = parent.pathByAddingChild(n);
childExpandCalled = expandAll(tree, path, expand) || childExpandCalled; // the OR order is important here, don't let childExpand first. func calls will be optimized out !
}
if (!childExpandCalled) { // only if one of the children hasn't called already expand
// Expansion or collapse must be done bottom-up, BUT only for non-leaf nodes
if (expand) {
tree.expandPath(parent);
} else {
tree.collapsePath(parent);
}
}
return true;
} else {
return false;
}
}
Dlaczego chcesz w pełni rozwinąć JTree o 100 000 węzłów? Tylko ułamek węzłów będzie pasował na ekranie, więc jaka jest korzyść z tego? – Adamski
Przypadek użycia pokazuje użycie części we wszystkich materiałach w naszym datastructur.To może teoretycznie prowadzić do tak dużej ilości danych. W tej chwili próbuję dowiedzieć się, co jest możliwe z JTree technicznie (szczególnie w porównaniu do elementu VirtualTreeView Delphi/C++) – hagt