TITLE:JFileChooserにファイルフィルタを追加
#navi(../)
#tags()
RIGHT:Posted by &author(aterai); at 2003-10-22
*JFileChooserにファイルフィルタを追加 [#ja5c24a0]
JFileChooserにファイルフィルタを追加します。

//-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(http://lh5.ggpht.com/_9Z4BYR88imo/TQTMc7NJ5UI/AAAAAAAAAZM/p-hliI-ZnLs/s800/FileFilter.png)

**サンプルコード [#v2620577]
#code(link){{
JFileChooser fileChooser = new JFileChooser();
fileChooser.addChoosableFileFilter(new FileFilter() {
  @Override public boolean accept(File file) {
    if(file.isDirectory()) return true;
    return file.getName().toLowerCase().endsWith(".jpg");
  }
  @Override public String getDescription() {
    return "JPEGファイル(*.jpg)";
  }
});
}}

**解説 [#id38fa2f]
上記のサンプルでは、フィルタを匿名インナークラスで書いていますが、複数のフィルタを追加する場合は、それぞれクラスを作ったほうがすっきり書けるかもしれません。

addChoosableFileFilter(FileFilter)メソッドを使うと、そのフィルタが現在選択されているフィルタになります。例えば「すべてのファイル」をデフォルト(選択された状態)に戻したい場合は、以下のようにします。
#code{{
fileChooser.addChoosableFileFilter(myFilter);
fileChooser.setFileFilter(fileChooser.getAcceptAllFileFilter()); 
}}

----
JDK 6 では、新しく javax.swing.filechooser.FileNameExtensionFilter クラスが追加されており、拡張子で選択できるファイルフィルタを簡単に作成することが出来ます(参考:[http://d.hatena.ne.jp/nowokay/20070228#1172660818 JavaSE6の便利クラス - きしだのはてな])。
#code{{
//FileNameExtensionFilter(String description, String... extensions)
FileFilter filter = new FileNameExtensionFilter("JPEGファイル(*.jpg)", "jpg", "jpeg");
fileChooser.addChoosableFileFilter(filter);
}}

上記のように説明の後に、可変長引数で拡張子を複数指定することが可能です。ドットは必要なく、大文字小文字も区別されないようです。

**参考リンク [#af725dfb]
-[http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6400960 Bug ID: 6400960 Swing File*Filters should extend java.io.File*Filters]

**コメント [#o0017e45]
-"jpg" → ".jpg" -- [[MT]] SIZE(10){&new{2003-12-24 (水) 12:15:54};}
-- 直しておきました。どもです。 -- [[aterai]] SIZE(10){&new{2003-12-24 (水) 12:41:13};}
- addChoosableFileFilterを何度も呼ぶと最後に追加されたものがデフォルトになるが、例えば2番目に追加したfilterを最後に再び追加すると2番目がデフォルトになる。 -- [[Y]] &new{2006-11-27 (月) 15:21:26};
-- addChoosableFileFilter(FileFilter)は、そのFileFilterがすでに含まれている場合は、setFileFilter(FileFilter)だけ実行するみたいですね。 -- [[aterai]] &new{2006-11-28 (火) 16:44:40};
#comment