概要

JFileChooserで読み取り専用属性ファイルのリネームを禁止します。

サンプルコード

class MetalCanWriteFileChooserUI extends MetalFileChooserUI {
  private BasicDirectoryModel model2;
  protected MetalCanWriteFileChooserUI(JFileChooser chooser) {
    super(chooser);
  }
  public static ComponentUI createUI(JComponent c) {
    if (c instanceof JFileChooser) {
      return new MetalCanWriteFileChooserUI((JFileChooser) c);
    }
    throw new InternalError("Should never happen");
  }
  @Override public void createModel() {
    if (model2 != null) {
      model2.invalidateFileCache();
    }
    model2 = new BasicDirectoryModel(getFileChooser()) {
      @Override public boolean renameFile(File oldFile, File newFile) {
        return oldFile.canWrite() ? super.renameFile(oldFile, newFile) : false;
      }
    };
  }
  @Override public BasicDirectoryModel getModel() {
    return model2;
  }
}
view all

解説

上記のサンプルでは、BasicDirectoryModel#renameFile(...)メソッドをオーバーライドし、読み取り専用属性の付いたファイルの名前変更を確定しようとすると警告ダイアログが表示されて、変更が取り消されるように設定しています。


sun.swing.FilePane#canWrite(File)をオーバーライドすれば、ファイル名の編集開始自体を禁止にすることもできそうですが、MetalFileChooserUIなどのUIFilePaneprivateになっているためかなり面倒です。

参考リンク

コメント