Forum Stats

  • 3,759,224 Users
  • 2,251,514 Discussions
  • 7,870,541 Comments

Discussions

How to sort jTree Nodes

843804
843804 Member Posts: 45,751
edited May 27, 2009 5:39AM in Swing
Hi,
I am interested in whats the easiest way to sort jTree Nodes alphabetically. Is there any Method to do this directly or may i use something like quicksort?
Thanks for help
Mirco

Comments

  • 843804
    843804 Member Posts: 45,751
    There is already a topic on this subject
    http://forum.java.sun.com/thread.jsp?forum=57&thread=563889

    Denis Krukovsky
    http://dotuseful.sourceforge.net/
  • 843804
    843804 Member Posts: 45,751
    I can't handel this classes. I didn't find out how to use them. Is there any other, maybe easier way to sort TreeNodes?
  • 843804
    843804 Member Posts: 45,751
    Thanks for your feedback. What you need to do is
    - create a Comparator for your nodes (I believe you know what it is?) or subclass org.dotuseful.ui.tree.SortedTreeNode and implement Comparable interface in it;
    - substitute your TreeModel with org.dotuseful.ui.tree.AutomatedTreeModel;
    - substitute your tree nodes with org.dotuseful.ui.tree.SortedTreeNode or its subclass, and optionally provide a Comparator for them.

    Here is a sketch of a node class that you need
    import org.dotuseful.ui.tree;
    public class ABSortTreeNode extends SortedTreeNode implements Comparable
        public int compareTo(Object o) {
            MutableTreeNode node = (MutableTreeNode)o;
            return ((Comparable)getUserObject()).compareTo(node.getUserObject());
        }
    }
    So having this class, you only need to
    - substitute your TreeModel with org.dotuseful.ui.tree.AutomatedTreeModel;
    - substitute your tree nodes with ABSortTreeNode.

    I believe this is pretty easy way to sort a tree. I would make my classes understandable for everyone, so please keep asking questions.

    Denis Krukovsky
    http://dotuseful.sourceforge.net/
  • 843804
    843804 Member Posts: 45,751
    Hi,
    The jtree nodes are sorted in jtree display.
    But how to keep folders (non-leaf-nodes) and leaf-nodes sorted separately?
    I�d like to have the leaf-nodes listed first under root and then all folders followed.
    Any ideas? Do you have any samples related that?
    Thank you for your help in advance.
  • 843804
    843804 Member Posts: 45,751
    Hi,

    Thank you for interest in dotuseful library. Good to have people who use our work.

    I'm going to write an article about directory tree creation. Stay tuned on http://dotuseful.sourceforge.net/

    For this time, what you need is to modify your Comparator or compareTo() method so your folders stay before your files.

    Denis Krukovsky
    http://dotuseful.sourceforge.net/
  • 843805
    843805 Member Posts: 49,999
    This is not exactly what you are looking for but might give you an idea.

    Hamed
    /**
    	 * @param root of tree
    	 * @return sorted elements alphabetically
    	 */
    	public static DefaultMutableTreeNode sortTree(DefaultMutableTreeNode root) {
    		for (int i = 0; i < root.getChildCount(); i++) {
    			DefaultMutableTreeNode node = (DefaultMutableTreeNode) root
    					.getChildAt(i);
    			String nt = node.getUserObject().toString();
    			for (int j=0; j<i; j++) {
    				DefaultMutableTreeNode prevNode = (DefaultMutableTreeNode) root
    				.getChildAt(j);
    				String np = prevNode.getUserObject().toString();
    				if (nt.compareToIgnoreCase(np)<0) {
    					root.insert(node, j);
    					root.insert(prevNode, i);
    				}
    			}
    			if (node.getChildCount() > 0) {
    				node = sortTree(node);
    			}
    		}
    		return root;
    	}
  • 843805
    843805 Member Posts: 49,999
    This is not exactly what you are looking for but might give you an idea.
    Thanks a lot for your code. It helped very much
  • 843806
    843806 Member Posts: 49,998
    Thanks Hamed,

    Well, I work in your code, and I post here.
      public static DefaultMutableTreeNode sortTree(DefaultMutableTreeNode root) {
            {
                     for (int i =0; i<root.getChildCount()-1; i++) {
                    		DefaultMutableTreeNode node = (DefaultMutableTreeNode) root.getChildAt(i);
                            String nt = node.getUserObject().toString();
    
                            for (int j=i+1;j<=root.getChildCount()-1;j++)
                            {
                                	DefaultMutableTreeNode prevNode = (DefaultMutableTreeNode) root.getChildAt(j);
    				                String np = prevNode.getUserObject().toString();
    
                                System.out.println(nt+" "+np);
                                if (nt.compareToIgnoreCase(np)>0) {
    
    				                  	root.insert(node, j);
    					                root.insert(prevNode, i);
    				              }
                            }
                            if (node.getChildCount() > 0) {
    				node = sortTree(node);
    			}
                     }
    
                     return root;
            }
        }
    and this code I used after include in jtree
      public  void jTreeSortingBegin()
        {
              dn = (DefaultMutableTreeNode)treeModel.getRoot();
              treeModel.reload();
              dn = sortTree(dn);
              treeModel.reload(dn);
        }
    for exemple
      addObject(jTextField1.getText());
            jTreeSortingBegin();
  • 843806
    843806 Member Posts: 49,998
    edited May 27, 2009 5:39AM
    Thank you very much, Hamed, I only had to change your code a little, replacing
    root.insert(prevNode, i);
    with
    break;
    insert(prevNode) is not necessary as insert(node) will shift the rest of the nodes. Break is necessary to begin relocating the next child (in that case we'll be done with that one).

    Edited by: Victor.E on May 27, 2009 2:38 AM
This discussion has been closed.