2012-03-15 183 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; 

}