---
category: swing
folder: DirectoryTree
title: FileSystemViewを使ってディレクトリ構造をJTreeに表示する
tags: [JTree, File, FileSystemView, SwingWorker]
author: aterai
pubdate: 2011-07-04T16:26:25+09:00
description: FileSystemViewを使ってディレクトリ構造をJTree上に表示します。
image: https://lh3.googleusercontent.com/-FkX-8X4KxDo/ThFoeY8M64I/AAAAAAAAA-Y/Ry_RA9yVCxc/s800/DirectoryTree.png
---
* 概要 [#summary]
`FileSystemView`を使ってディレクトリ構造を`JTree`上に表示します。主に[https://stackoverflow.com/questions/6182110/file-browser-gui java - File Browser GUI - Stack Overflow]を参考にしています。

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

* サンプルコード [#sourcecode]
#code(link){{
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 =
    JTree tree = (JTree) e.getSource();
    DefaultMutableTreeNode node =
      (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
    final DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    // final TreePath path = e.getPath();
    DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    // TreePath path = e.getPath();

    if (!node.isLeaf()) return;
    final File parent = (File) node.getUserObject();
    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(List<File> chunks) {
        for (File file: chunks) {
          node.add(new DefaultMutableTreeNode(file));
        }
        model.nodeStructureChanged(node);
        // tree.expandPath(path);
      }
    };
    worker.execute();
  }
}
}}

* 解説 [#explanation]
このサンプルでは、[https://stackoverflow.com/questions/6182110/file-browser-gui java - File Browser GUI - Stack Overflow]のディレクトリ表示部分を抜き出して、ルートパーティション(`Windows`の場合、`Desktop`フォルダ)をルートノードにして`JTree`で表示しています。

- クリックされたノードがディレクトリの場合、子ファイルの検索と`JTree`へのそれらの追加を`SwingWorker`を使用して別スレッドで実行するよう変更

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/filechooser/FileSystemView.html FileSystemView (Java Platform SE 8)]
- [https://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]

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