TITLE:FileSystemViewを使ってディテクトリ構造をJTreeに表示する
#navi(../)
RIGHT:Posted by [[aterai]] at 2011-07-04
*FileSystemViewを使ってディテクトリ構造をJTreeに表示する [#k90648c1]
FileSystemViewを使ってディテクトリ構造をJTree上に表示します。主に[http://stackoverflow.com/questions/6182110/file-browser-gui java - File Browser GUI - Stack Overflow]を参考にしています。

//-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(https://lh3.googleusercontent.com/-FkX-8X4KxDo/ThFoeY8M64I/AAAAAAAAA-Y/Ry_RA9yVCxc/s800/DirectoryTree.png)

**サンプルコード [#kd226fda]
#code{{
class FolderSelectionListener implements TreeSelectionListener{
  private final FileSystemView fileSystemView;
  public FolderSelectionListener(FileSystemView fileSystemView) {
    this.fileSystemView = fileSystemView;
  }
  @Override public void valueChanged(TreeSelectionEvent e) {
    final JTree tree = (JTree)e.getSource();
    final DefaultMutableTreeNode node =
      (DefaultMutableTreeNode)e.getPath().getLastPathComponent();
    final DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
    final TreePath path = e.getPath();

    if(!node.isLeaf()) return;
    final File parent = (File)node.getUserObject();
    if(!parent.isDirectory()) return;

    SwingWorker<String, File> worker = new SwingWorker<String, File>() {
      @Override public String doInBackground() {
        File[] children = fileSystemView.getFiles(parent, true);
        for(File child: children) {
          if(child.isDirectory()) {
            publish(child);
          }
        }
        return "done";
      }
      @Override protected void process(java.util.List<File> chunks) {
        for(File file: chunks) {
          node.add(new DefaultMutableTreeNode(file));
        }
        model.nodeStructureChanged(node);
        //tree.expandPath(path);
      }
    };
    worker.execute();
  }
}
}}

**解説 [#e6464a40]
このサンプルでは、[http://stackoverflow.com/questions/6182110/file-browser-gui java - File Browser GUI - Stack Overflow]のディレクトリ表示部分を抜き出して、ルートパーティション(Windows の場合、Desktop フォルダ)をルートノードにしてJTreeで表示しています。
----
クリックされたノードがディレクトリだった場合、子ファイルの検索とJTreeへのそれらの追加がSwingWorkerを使って別々のスレッドで行われます。

**参考リンク [#g062d7c1]
- [http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/filechooser/FileSystemView.html FileSystemView (Java Platform SE 6)]
- [http://stackoverflow.com/questions/6182110/file-browser-gui java - File Browser GUI - Stack Overflow]
- [http://www.pushing-pixels.org/2007/07/22/showing-the-file-system-as-a-swing-jtree.html Showing the file system as a Swing JTree ・ Pushing Pixels]

**コメント [#j26d644a]
#comment