ngranin
ngranin

Reputation: 301

DefaultTreeModel methods are executing slowly in some circumstances

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

Answers (0)

Related Questions