2014-12-05 3 views
2

나는 JTree이 뭔가를 바탕 화면보기를 얻을 싶습니다 Java에 이르기까지,이를 달성하기위한 어려움을 찾아야합니다.바탕 화면보기 Windows에만

public class FileTreeDemo { 

    public static void main(String[] args) { 
     File root; 
     if (args.length > 0) { 
      root = new File(args[0]); 
     } else { 
      root = new File(System.getProperty("user.home")); 
     } 

     System.out.println(root); 
     FileTreeModel model = new FileTreeModel(root); 

     JTree tree = new JTree(); 
     tree.setModel(model); 
     tree.setRootVisible(true); 
     tree.setShowsRootHandles(true); 

     JScrollPane scrollpane = new JScrollPane(tree); 

     JFrame frame = new JFrame("FileTreeDemo"); 
     frame.getContentPane().add(scrollpane, "Center"); 
     frame.setSize(400,600); 
     frame.setVisible(true);  
    } 
} 

class FileTreeModel implements TreeModel { 

    protected File root; 

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

    public Object getRoot() { return root; } 

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

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

    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]); 
    } 

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

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

    public void addTreeModelListener(TreeModelListener l) {} 
    public void removeTreeModelListener(TreeModelListener l) {} 
} 

지금까지 내가 변경 시도 FileTreeModel 클래스 '시스템 등록 정보'가 있지만 작동하지 않았다 :

다음

지금까지 내 코드입니다
"user.dir" 

제발 어떤 방향을 보여줘 보여줘. 고마워.

+0

또한 [File Browser GUI] (http://codereview.stackexchange.com/q/4446/7784)를 참조하십시오. –

답변

3

요구 사항을 올바르게 이해하면 FileSystemView 클래스를 사용해야 루트 파티션과 같은 OS 관련 데이터를 얻을 수 있습니다. JDK1.1 File API는 액세스 OS 관련 정보를 허용하지 않기 때문에

참고 : Windows에서 Desktop 폴더는 루트 노드로 간주됩니다.

FileSystemView fileSystemView = FileSystemView.getFileSystemView(); 
for (File file : fileSystemView.getRoots()) { 
    System.out.println("Root: " + file); 
    for (File f : file.listFiles()) { 
     if (f.isDirectory()) { 
      System.out.println("Child: " + f); 
     } 
    } 
} 

각에 대한 올바른 아이콘을 설정하려면 다음과 같은 방법을 사용할 수 있습니다 : 예를 들어, Windows에서 다음 코드를 실행하면 거의 사진처럼 포함 한, 바탕 화면에서 볼 수있는 폴더를 인쇄해야 노드 :

+1

아주 좋은데,이 방법은 "C : \ Users [사용자 이름] \ Desktop"과 "C : \ Users \ Public \ Public Desktop"폴더가 실제로 보완 적입니다. Desktop 폴더의 내용 나를 위해 누락 된 유일한 두 가지는 "제어판"과 "휴지통"입니다. –

+1

감사합니다 얘들 아, 나는 [list] (http://i.imgur.com/NK0COAh.png)에서 원했던 모든 것을 얻었으며, 시간과 도움을 주신 많은 분들께 감사드립니다. –

1

Windows 데스크톱의 "특수 폴더"(this Wikipedia article 참조)는 "C ​​: \ Users [사용자 이름] \ Desktop"및 "C : \ Users \ Public \ Public Desktop"과 같은 여러 폴더의 조합이라고 생각합니다. 트리 노드에서 둘 이상의 폴더를 결합하려면 your earlier question에서 논의 된 것과 같은 사용자 정의 트리 모델이 필요합니다.

+0

공용 데스크톱 폴더를 고려해 볼 때 답을 높이 평가하고 싶습니다. 그러나 그것은 매우 OS 고유의 모든 Java 응용 프로그램은 플랫폼 독립적 인 것으로되어 있기 때문에 나는 그렇게하기를 꺼립니다. 다른 한편으로 나는 이전 질문에서 다중 루트 제안을 upvoted했습니다 :-) – dic19

+1

예, 질문은 아마도 Windows 전용으로 태그되어야합니다. OS X와 ​​Linux의 경우 완전히 다른 접근 방식을 취할 것입니다. –

관련 문제