---
category: swing
folder: DisableNewFolderAction
title: JFileChooserで新規フォルダ作成を無効化する
tags: [JFileChooser]
author: aterai
pubdate: 2022-05-09T03:24:27+09:00
description: JFileChooserで既存ファイルの名前変更は有効のまま新規フォルダの作成のみ無効に設定します。
image: https://drive.google.com/uc?id=1a7Lm2pVbgfsEnORKxYiekYuJz_rAwCCI
---
* 概要 [#summary]
`JFileChooser`で既存ファイルの名前変更は有効のまま新規フォルダの作成のみ無効に設定します。

#download(https://drive.google.com/uc?id=1a7Lm2pVbgfsEnORKxYiekYuJz_rAwCCI)

* サンプルコード [#sourcecode]
#code(link){{
JFileChooser fc2 = new JFileChooser();
fc2.setFileSystemView(new FileSystemView() {
  @Override public File createNewFolder(File containingDir) {
    return null;
  }
});
String cmd = "New Folder"; // = sun.swing.FilePane.ACTION_NEW_FOLDER
Optional.ofNullable(fc2.getActionMap().get(cmd)).ifPresent(a -> a.setEnabled(false));
fc2.addPropertyChangeListener(JFileChooser.DIRECTORY_CHANGED_PROPERTY, e -> {
  if (e.getNewValue() instanceof File) {
    Optional.ofNullable(fc2.getActionMap().get(cmd)).ifPresent(a -> a.setEnabled(false));
  }
});
}}

* 解説 [#explanation]
- `FileSystemView#createNewFolder(...)`をオーバーライドし`null`を返すよう設定して新規フォルダの作成を無効化
-- ツールバーの「新規フォルダの作成」ボタンやコンテキストメニューの「新規フォルダ」メニューアイテムはクリック可能だが、クリックしても新規フォルダが作成されなくなる
- `JFileChooser#getActionMap()`で`FilePane.ACTION_NEW_FOLDER`アクションを取得し`setEnabled(false)`で無効化
-- フォルダごとに新規フォルダが作成可能かどうかは変化するので、`JFileChooser`に`PropertyChangeListener`を追加してカレントディレクトリが変更されるたびに「新規フォルダの作成」アクションを無効化している
-- [https://bugs.openjdk.java.net/browse/JDK-8021379 [JDK-8021379] JFileChooser Create New Folder button enabled in write proteced directory - Java Bug System]
-- [https://bugs.openjdk.org/browse/JDK-8021379 [JDK-8021379] JFileChooser Create New Folder button enabled in write proteced directory - Java Bug System]
-- [[JFileChooserに画像プレビューを追加>Swing/PreviewAccessory]]
- `UIManager.put("FileChooser.readOnly", Boolean.TRUE)`で`JFileChooser`をリードオンリーにすると「新規フォルダの作成」だけでなくファイルの「名前の変更」も不可になる
-- [[JFileChooserを編集不可にする>Swing/ROFileChooser]]

* 参考リンク [#reference]
- [[JFileChooserを編集不可にする>Swing/ROFileChooser]]
- [[JFileChooserに画像プレビューを追加>Swing/PreviewAccessory]]
- [https://bugs.openjdk.java.net/browse/JDK-8021379 [JDK-8021379] JFileChooser Create New Folder button enabled in write proteced directory - Java Bug System]
- [https://bugs.openjdk.org/browse/JDK-8021379 [JDK-8021379] JFileChooser Create New Folder button enabled in write proteced directory - Java Bug System]

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