2012-03-15 240 views
4

我已经加载我的JTree来查看我的目录结构,如我的代码和输出图像所示。 在这里,树节点默认按字母顺序排序,但是我的另一个要求是我想根据目录名称的第二个名称对所有节点进行排序,而不实际重命名目录。 我已经强调了我需要对JTree节点进行排序的名称。请给我一些建议。按字母顺序排序Jtree节点

import java.io.File; 
import javax.swing.JFrame; 
import javax.swing.JTree; 
import javax.swing.event.TreeModelListener; 
import javax.swing.tree.TreeModel; 
import javax.swing.tree.TreePath; 

public class FILE_NAME { 
public static void main(String[] args) { 
     JFrame frame = new JFrame("My Jtree"); 

     File root = new File("C:/java"); 
     JTree tree = new JTree(new FileTreeModel(root)); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(tree); 
     frame.setVisible(true);    
     } 
    } 

class FileTreeModel implements TreeModel { 

protected File root; 

public FileTreeModel(File root) { 
    this.root = root; 
} 

@Override 
public Object getRoot() { 
    return root; 
} 

@Override 
public boolean isLeaf(Object node) { 
    return ((File) node).isFile(); 
} 

@Override 
public int getChildCount(Object parent) { 
    String[] children = ((File) parent).list(); 
    if (children == null) { 
     return 0; 
    } 
    return children.length; 
} 

@Override 
public Object getChild(Object parent, int index) { 
    String[] children = ((File) parent).list(); 
    if ((children == null) || (index == children.length)) { 
     return null; 
    } 
    return new File((File) parent, children[index]); 
} 

@Override 
public int getIndexOfChild(Object parent, Object child) { 
    String[] children = ((File) parent).list(); 
    String childname = ((File) child).getName(); 
    if (children == null) { 
     return -1; 
    } 
    for (int i = 0; i == children.length; i++) { 
     if (childname.equals(children[i])) { 
      return i; 
     } 
    } 
    return -1; 
} 

@Override 
public void valueForPathChanged(TreePath path, Object newvalue) { 
} 

@Override 
public void addTreeModelListener(TreeModelListener l) { 
} 

@Override 
public void removeTreeModelListener(TreeModelListener l) { 
} 
} 

输出

enter image description here

+0

* “请建议我的东西” * 1)描述你已经尝试了什么。 2)提出问题。 – 2012-03-15 07:28:22

+0

以及我仍然试图让你知道不久 – Jony 2012-03-15 08:17:49

+1

如果你不需要动态排序,最简单的方法是在构建TreeModel时对它进行排序 – Robin 2012-03-15 09:07:16

回答

2

你可以使用Arrays.sort()方法,使用比较,并编写自己的比较器,通过自己的规则比较条目,这样的:

String[] children = ((File) parent).list(); 
Arrays.sort(children, new Comparator<String>() { 
    @Override 
    public int compare(String o1, String o2) { 
     // do your comparison 
    } 
}); 

在模型方法中它会被重载,所以你可以考虑在so中保存目录列表我模拟私人领域,并检查模型方法调用目录是否没有改变(比较File.lastModified()将有所帮助)。如果是 - 保存新的列表。

4

它是这样的:

public void sortTree() { 
    treeModel.reload(sort(rootNode)); 
} 

public DefaultMutableTreeNode sort(DefaultMutableTreeNode node) { 

    //sort alphabetically 
    for(int i = 0; i < node.getChildCount() - 1; i++) { 
     DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(i); 
     String nt = child.getUserObject().toString(); 

     for(int j = i + 1; j <= node.getChildCount() - 1; j++) { 
      DefaultMutableTreeNode prevNode = (DefaultMutableTreeNode) node.getChildAt(j); 
      String np = prevNode.getUserObject().toString(); 

      System.out.println(nt + " " + np); 
      if(nt.compareToIgnoreCase(np) > 0) { 
       node.insert(child, j); 
       node.insert(prevNode, i); 
      } 
     } 
     if(child.getChildCount() > 0) { 
      sort(child); 
     } 
    } 

    //put folders first - normal on Windows and some flavors of Linux but not on Mac OS X. 
    for(int i = 0; i < node.getChildCount() - 1; i++) { 
     DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(i); 
     for(int j = i + 1; j <= node.getChildCount() - 1; j++) { 
      DefaultMutableTreeNode prevNode = (DefaultMutableTreeNode) node.getChildAt(j); 

      if(!prevNode.isLeaf() && child.isLeaf()) { 
       node.insert(child, j); 
       node.insert(prevNode, i); 
      } 
     } 
    } 

    return node; 

}