• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JFileChooserにファイルフィルターを追加
#navi(../)
*JFileChooserにファイルフィルターを追加 [#ja5c24a0]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2003-10-22~
更新日:&lastmod;
---
category: swing
folder: FileFilter
title: JFileChooserにファイルフィルタを追加
tags: [JFileChooser, FileFilter]
author: aterai
pubdate: 2003-11-17
description: JFileChooserにファイルフィルタを追加します。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTMc7NJ5UI/AAAAAAAAAZM/p-hliI-ZnLs/s800/FileFilter.png
---
* 概要 [#summary]
`JFileChooser`にファイルフィルタを追加します。

#contents
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTMc7NJ5UI/AAAAAAAAAZM/p-hliI-ZnLs/s800/FileFilter.png)

**概要 [#dc15e0b1]
JFileChooserにファイルフィルターを追加します。
* サンプルコード [#sourcecode]
#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(Locale.ENGLISH).endsWith(".jpg");
  }

#screenshot
  @Override public String getDescription() {
    return "JPEGファイル(*.jpg)";
  }
});
}}

**サンプルコード [#v2620577]
 JFileChooser fileChooser = new JFileChooser();
 fileChooser.addChoosableFileFilter(new FileFilter() {
   public boolean accept(File file) {
     if(file.isDirectory()) return true;
     if(file.getName().toLowerCase().endsWith(".jpg")) return true;
     return false;
   }
   public String getDescription() {
     return "JPEGファイル(*.jpg)";
   }
 });
* 解説 [#explanation]
上記のサンプルでは、`JFileChooser#addChoosableFileFilter(FileFilter)`メソッドを使用して拡張子がたとえば`.jpg`のファイルのみを表示する`FileFilter`を追加設定しています。

//-&jnlp;
-&jar;
-&zip;
----
- %%`addChoosableFileFilter(FileFilter)`メソッドを使うとそのフィルタが現在選択されているフィルタになる%%
-- %%例えば「すべてのファイル」をデフォルト(選択された状態)に戻したい場合は、`JFileChooser#getAcceptAllFileFilter()`を再設定する必要がある%% -
- `JDK 7`から`JFileChooser#addChoosableFileFilter(...)`内で`JFileChooser#setFileFilter(...)`を呼ばなくなった
-- [https://bugs.openjdk.org/browse/JDK-4776197 JDK-4776197 JFileChooser has an easy-to-fix but serious performance bug - Java Bug System]

**解説 [#id38fa2f]
上記のサンプルでは、フィルターを匿名インナークラスで書いていますが、複数のフィルターを追加する場合は、それぞれクラスを作ったほうがすっきり書けるかもしれません。
----
- `java.awt.FileDialog`は以下のように`java.io.FilenameFilter`を使用する
-- [https://docs.oracle.com/javase/jp/8/docs/api/java/awt/FileDialog.html#setFilenameFilter-java.io.FilenameFilter- FileDialog#setFilenameFilter(FilenameFilter) (Java Platform SE 8)]
-- `JFileChooser`に`java.io.FilenameFilter`は設定不可

**コメント [#o0017e45]
-"jpg" → ".jpg" -- [[MT]] SIZE(10){&new{2003-12-24 (水) 12:15:54};}
-直しておきました。どもです。 -- [[terai]] SIZE(10){&new{2003-12-24 (水) 12:41:13};}
#code{{
FileDialog fd = new FileDialog(frame, "title");
FilenameFilter filter = (dir, file) -> file.toLowerCase(Locale.ENGLISH).endsWith(".jpg");
fd.setFilenameFilter(filter);
}}

----
- `JDK 6`では、新しく[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/filechooser/FileNameExtensionFilter.html 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);
}}

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JFileChooser.html#addChoosableFileFilter-javax.swing.filechooser.FileFilter- JFileChooser#addChoosableFileFilter(...) (Java Platform SE 8)]
- [https://bugs.openjdk.org/browse/JDK-6400960 Bug ID: 6400960 Swing File*Filters should extend java.io.File*Filters]
- [https://bugs.openjdk.org/browse/JDK-4776197 JDK-4776197 JFileChooser has an easy-to-fix but serious performance bug - Java Bug System]

* コメント [#comment]
#comment
-`jpg` → `.jpg` -- &user(MT); &new{2003-12-24 (水) 12:15:54};
-- 直しておきました。どもです。 -- &user(aterai); &new{2003-12-24 (水) 12:41:13};
- `addChoosableFileFilter`を何度も呼ぶと最後に追加されたものがデフォルトになるが、例えば`2`番目に追加した`filter`を最後に再び追加すると`2`番目がデフォルトになる。 -- &user(Y); &new{2006-11-27 (月) 15:21:26};
-- `addChoosableFileFilter(FileFilter)`は、その`FileFilter`がすでに含まれている場合は、`setFileFilter(FileFilter)`だけ実行するみたいですね。 -- &user(aterai); &new{2006-11-28 (火) 16:44:40};
-- 追記: [https://bugs.openjdk.org/browse/JDK-4776197 JDK-4776197 JFileChooser has an easy-to-fix but serious performance bug - Java Bug System]で、この動作は修正されたようです。 -- &user(aterai); &new{2018-03-13 (火) 20:46:52};

#comment