Summary

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

Source Code Examples

class FolderSelectionListener implements TreeSelectionListener {
  private final FileSystemView fileSystemView;

  protected FolderSelectionListener(FileSystemView fileSystemView) {
    this.fileSystemView = fileSystemView;
  }

  @Override public void valueChanged(TreeSelectionEvent e) {
    DefaultMutableTreeNode node =
      (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
    File parent = (File) node.getUserObject();
    // Java 9:
    // // https://ateraimemo.com/Swing/ResolveShortcutsLinkLocation.html
    // if (fileSystemView.isLink(parent)) {
    //   try {
    //     parent = fileSystemView.getLinkLocation(parent);
    //   } catch (FileNotFoundException ex) {
    //     return;
    //   }
    // }
    if (!node.isLeaf() || !parent.isDirectory()) {
      return;
    }
    JTree tree = (JTree) e.getSource();
    DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    new BackgroundTask(fileSystemView, parent) {
      @Override protected void process(List<File> chunks) {
        if (tree.isDisplayable() && !isCancelled()) {
          chunks.stream().map(DefaultMutableTreeNode::new)
              .forEach(child -> model.insertNodeInto(
                       child, node, node.getChildCount()));
        } else {
          cancel(true);
        }
      }
    }.execute();
  }
}
View in GitHub: Java, Kotlin

Description

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

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

Reference

Comment