Link to home
Start Free TrialLog in
Avatar of spetrowitsch
spetrowitsch

asked on

How to get a root from a JTree?

Hi.

I wanted to get all leafs of a jTree. I made it like this, but that works only, if I have already the root.


DefaultMutableTreeNode t2;
String AllLeafs = "";

t2 = root;

while (t2 != null)
{ t2 = t2.getNextNode();
  try
  { if (t2.isLeaf())
    { AllLeafs += "/" + t2.toString();
    }
  }
  catch (Exception event)
  { t2 = null;
  }
}

Then I wanted to get the root like this,
but there is a problem with getModel: it doesn´t get the DefaultTreeModel, but a TreeModel, and from TreeModel I don´t get a DefaultMutableTreeNode (the type of t2).

DefaultTreeModel treeMod = (DefaultTreeModel) jTree1.getModel();
t2 = treeMod.getRoot();

The second question is, how to find out, when my tree is finished? (I used the try-catch-method, but I would be interested in knowing the "official" solution.

Thanks so much in advance!!!
Avatar of _lychee_
_lychee_

to your second qn, the tree is finished when getNextNode() is null... so just test for it....

the java API states that getNextNode is inefficient for traversal... u should get a depthFirstEnumeration of the tree and then traverse that....

for ur first qn, y don't u just traverse the tree yourself? eg. (doesn't use DefaultMutableTreeNode)... say t is part of the tree...

Stack s = new Stack();
TreeNode root = t;
TreeNode cur;
Enumeration e;
String AllLeafs = "";

while ((cur = root.getParent())!=null) root = cur;

s.push(root);
while (!s.empty()) {
   cur = (TreeNode) s.pop();
   if (cur.isLeaf()) {
      AllLeafs+="/"+cur.toString();
   } else {
      e = cur.children();
      while (e.hasMoreElements()) s.push(e.nextElement());
   }
}

// done.
ASKER CERTIFIED SOLUTION
Avatar of vivexp
vivexp

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial