DATE : 2006/06/28 (Wed)
javax.swing.JFileChooser を使うと、ファイルを選択するダイアログを開くことができます。
また、JFileChooser に javax.swing.filechooser.FileFilter を登録すると、ダイアログに表示するファイルに制限を加えることができます。例えば、JPEG ファイルのみを選択できるようにするといった具合です。
FileFilter は抽象クラスなので、利用するにはサブクラスを作らなければなりません。
FileFilter には、 FileFilter#accept(java.io.File) と FileFilter#getDescription() と、抽象メソッドが2つ定義されています。前者が引数に渡された File を表示するかどうか真偽値で返し、後者が FileFileter の説明(Windows のファイル選択ダイアログで言うと、「ファイルの種類」の欄に出てくる説明)を文字列で返します。
ここで、先程のように JPEG ファイルのみを表示する FileFilter を作成してみます。ただし、ここでは簡単のため、拡張子が「.jpg」のファイルのみを表示可能にします。
以下に、FileFilter#accept(java.io.File) のコードを示します。
(import 文などは省略)
public boolean accept(File file) {
// ファイル名(全て小文字に変換)
String name = file.getName().toLowerCase();
// 拡張子「.jpg」のファイルなら表示
return name.endsWith(".jpg");
}
しかし、このコードは間違いです。
実際にこの FileFilter を JFileChooser に設定すると、選択欄にほとんど何も表示されず、面食らうことになります。
実は、 FileFilter#accept(java.io.File) にはディレクトリも渡されることになっています。もともと java.io.File は、あくまでもファイルパスの表現でしかないため、中身がファイルを示すことがあれば、ディレクトリを示すこともあります。
つまり上のコードでは、ファイルもディレクトリも「.jpg」で終わっているものでなければ表示しないフィルタになっているのです。
そこで、渡された File がディレクトリの場合はダイアログに表示するように、上のコードを書き換えます。
(import 文などは省略)
public boolean accept(File file) {
// ディレクトリであればダイアログに表示
if (file.isDirectory()) {
return true;
}
// ファイル名(全て小文字に変換)
String name = file.getName().toLowerCase();
// 拡張子「.jpg」のファイルなら表示
return name.endsWith(".jpg");
}