2012-03-15 25 views
4

自分のJTreeをロードして、自分のディレクトリ構造を自分のコードと出力イメージに表示しました。 ツリーノードは、デフォルトでアルファベット順にソートされていますが、実際にはディレクトリの名前を変更せずに、すべてのノードをディレクトリ名の第2の名前に従って並べ替える必要があります。 JTreeノードをソートする必要がある名前に下線を引いています。私に何かを提案してください。あなたはコンパレータを使用しては、Arrays.sort()メソッドを使用し、そのように、独自のルールにより、エントリを比較し、あなた自身のコンパレータを書くことができ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) { 
} 
} 

OUTPUT

enter image description here

+0

* "私に何かを提案してください" * 1)あなたがしようとしているものを説明してください。 2)質問をする。 –

+0

よく私はまだ試してみます – Jony

+1

動的ソートが必要ない場合は、TreeModelを構築するときにTreeModelをソートするのが最も簡単な方法です – Robin

答えて

2

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

モデルメソッドでは過負荷になるので、ディレクトリリストをそのように保存することを検討することがありますモデルのプライベートフィールドをモデル化し、モデルメソッドの呼び出しでディレクトリが変更されていないかどうかを確認します(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; 

} 
関連する問題