概要

JFileChooserで既存ファイルの名前変更は有効のまま新規フォルダの作成のみ無効に設定します。

スクリーンショット

Swing/DisableNewFolderAction.png

サンプルコード

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));
  }
});
View in GitHub: Java, Kotlin

解説

  • FileSystemView#createNewFolder(...)をオーバーライドしnullを返すよう設定して新規フォルダの作成を無効化
    • ツールバーの「新規フォルダの作成」ボタンやコンテキストメニューの「新規フォルダ」メニューアイテムはクリック可能だが、クリックしても新規フォルダが作成されなくなる
  • JFileChooser#getActionMap()FilePane.ACTION_NEW_FOLDERアクションを取得しsetEnabled(false)で無効化
  • UIManager.put("FileChooser.readOnly", Boolean.TRUE)JFileChooserをリードオンリーにすると「新規フォルダの作成」だけでなくファイルの「名前の変更」も不可になる

参考リンク

コメント