概要

FileSystemViewを使ってディレクトリ構造をJTree上に表示します。主にjava - File Browser GUI - Stack Overflowを参考にしています。

サンプルコード

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(List<File> chunks) {
        for (File file: chunks) {
          node.add(new DefaultMutableTreeNode(file));
        }
        model.nodeStructureChanged(node);
        //tree.expandPath(path);
      }
    };
    worker.execute();
  }
}
view all

解説

このサンプルでは、java - File Browser GUI - Stack Overflowのディレクトリ表示部分を抜き出して、ルートパーティション(Windowsの場合、Desktopフォルダ)をルートノードにしてJTreeで表示しています。

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

参考リンク

コメント