• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JFileChooserで読み取り専用ファイルのリネームを禁止
#navi(../)
#tags(JFileChooser, File, BasicDirectoryModel)
RIGHT:Posted by &author(aterai); at 2011-10-17
*JFileChooserで読み取り専用ファイルのリネームを禁止 [#u21472b3]
``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
---
* 概要 [#summary]
`JFileChooser`で読み取り専用属性ファイルのリネームを禁止します。

//-&jnlp;
-&jar;
-&zip;
#download(https://lh5.googleusercontent.com/-7ODSj6DaIig/TpsQEay0NqI/AAAAAAAABDs/8fz14wjADj0/s800/RenameIfCanWriteFileChooser.png)

//#screenshot
#ref(https://lh5.googleusercontent.com/-7ODSj6DaIig/TpsQEay0NqI/AAAAAAAABDs/8fz14wjADj0/s800/RenameIfCanWriteFileChooser.png)

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

  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;

  @Override public void createModel() {
    if(model2!=null) {
    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;
        return oldFile.canWrite() ? super.renameFile(oldFile, newFile) : false;
      }
    };
  }

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

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

----
``sun.swing.FilePane#canWrite(File)``をオーバーライドすれば、編集開始自体を禁止にすることもできそうですが、``MetalFileChooserUI``などの``UI``で``FilePane``が``private``になっているためかなり面倒です。
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/plaf/basic/BasicDirectoryModel.html#renameFile-java.io.File-java.io.File- BasicDirectoryModel#renameFile(...) (Java Platform SE 8)]
- [https://community.oracle.com/thread/2300004 Swing - How does the JFileChooser "readOnly" property work?]
- [[JFileChooserを編集不可にする>Swing/ROFileChooser]]

**参考リンク [#ta778ea1]
-[https://forums.oracle.com/forums/thread.jspa?threadID=2298004 OTN Discussion Forums : How does the JFileChooser "readOnly" ...]
-[[JFileChooserを編集不可にする>Swing/ROFileChooser]]

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