TITLE:JFileChooserで読み取り専用ファイルのリネームを禁止
Posted by aterai at 2011-10-17

JFileChooserで読み取り専用ファイルのリネームを禁止

JFileChooserで読み取り専用属性ファイルのリネームを禁止します。
  • category: swing folder: RenameIfCanWriteFileChooser title: JFileChooserで読み取り専用ファイルのリネームを禁止 tags: [JFileChooser, File, BasicDirectoryModel] author: aterai pubdate: 2011-10-17T12:57:18+09:00 description: JFileChooserで読み取り専用属性ファイルのリネームを禁止します。 image: https://lh5.googleusercontent.com/-7ODSj6DaIig/TpsQEay0NqI/AAAAAAAABDs/8fz14wjADj0/s800/RenameIfCanWriteFileChooser.png

概要

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

サンプルコード

#spanend
#spandel
class CanWriteFileChooserUI extends MetalFileChooserUI{
#spanend
  protected CanWriteFileChooserUI(JFileChooser chooser) {
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
class MetalCanWriteFileChooserUI extends MetalFileChooserUI {
#spanend
  private BasicDirectoryModel model2;
  protected MetalCanWriteFileChooserUI(JFileChooser chooser) {
    super(chooser);
  }
#spanadd

#spanend
  public static ComponentUI createUI(JComponent c) {
    return new CanWriteFileChooserUI((JFileChooser)c);
    if (c instanceof JFileChooser) {
      return new MetalCanWriteFileChooserUI((JFileChooser) c);
    }
    throw new InternalError("Should never happen");
  }
  private BasicDirectoryModel model2 = null;
#spanadd

#spanend
  @Override public void createModel() {
    if(model2!=null) {
    if (model2 != null) {
      model2.invalidateFileCache();
    }
    model2 = new BasicDirectoryModel(getFileChooser()) {
      public boolean renameFile(File oldFile, File newFile) {
        return oldFile.canWrite()?super.renameFile(oldFile, newFile):false;
      @Override public boolean renameFile(File oldFile, File newFile) {
        return oldFile.canWrite() ? super.renameFile(oldFile, newFile) : false;
      }
    };
  }
#spanadd

#spanend
  @Override public BasicDirectoryModel getModel() {
    return model2;
  }
}

解説

上記のサンプルでは、BasicDirectoryModel#renameFile(...)をオーバーライドして取り専用属性ファイルのリネームを確定しようとすると警告ダイアログが表示されるようになっています。

解説

  • BasicDirectoryModel#renameFile(...)メソッドをオーバーライドし、読み取り専用属性の付いたファイルの名前変更を確定しようとすると警告ダイアログを表示して変更が取り消されるように設定
  • 別方法としてsun.swing.FilePane#canWrite(File)をオーバーライドすればファイル名の編集開始自体を禁止にすることが可能かもしれない?
    • MetalFileChooserUIなどのUIFilePaneprivateになっているため難しそう
  • - sun.swing.FilePane#canWrite(File)をオーバーライドすれば、編集開始できないようにすることもできそうですが、MetalFileChooserUIなどのUIでFilePaneはprivateになっているためかなり面倒です。

参考リンク

参考リンク

コメント

コメント