Reputation: 301
I have a method that recalculates all nodes of the passed bunch.
In some environments, I have an issue with delays (about 15ms) calling methods of the DefaultTreeModel
class such as getChildCount
, getChild
, insertNodeInto
. Interesting enough this delay occurs not for every element in the loop.
What is the possible reason for such behaviour of DefaultTreeModel? Is this something to do with threads in Swing?
public void refresh(DefaultTreeModel model, MyTreeNode bunchNode,
Vector<?> objects, int depth, int maxDepth) {
int numberOfBunchNodes;
//insert all objects
for (int i = 0; i < objects.size(); i++) {
MyTreeNode newNode = null;
numberOfBunchNodes = model.getChildCount(bunchNode);
if (i < numberOfBunchNodes) {
//insert node if not same objects
MyTreeNode bNode = (MyTreeNode) model.getChild(bunchNode, i);
if (bNode.getUserObject() != objects.elementAt(i)) {
newNode = new MyTreeNode(objects.elementAt(i));
model.insertNodeInto(newNode, bunchNode, i);
}
else {
model.nodeChanged(bNode);
newNode = bNode;
}
}
else {
newNode = new MyTreeNode(objects.elementAt(i));
model.insertNodeInto(newNode, bunchNode, i);
}
if (depth < maxDepth) {
Vector<?> subTreeItems = getFurtherNodes(newNode);
if (!subTreeItems.isEmpty()) {
refresh(model, newNode, subTreeItems, depth + 1, maxDepth);
}
}
}
//remove obsolete tree nodes
numberOfBunchNodes = bunchNode.getChildCount();
if (numberOfBunchNodes > objects.size()) {
for (int i = numberOfBunchNodes - 1; i >= objects.size(); i--) {
model.removeNodeFromParent((MyTreeNode) model.getChild(bunchNode, i));
}
}
}
P.s. Such delay is critical when Jtree contains many elements, for example having 100 elements in model
causes the refresh method to take about 1.5 seconds.
Upvotes: 0
Views: 62