フィルタを追加する

広告

ダイアログが表示された時に「隠しファイル」以外はデフォルトで全て表示されます。フィルタを作成し追加すると、例えば特定の拡張子を持つファイルだけを表示するように制限することが可能です。フィルタを作成して追加するにはJFileChooserクラスで用意されている「addChoosableFileFilter」メソッドを使います。

public void addChoosableFileFilter(FileFilter filter)

ユーザーが選択可能なファイルフィルタのリストにフィルタを追加します。ファ
イル選択モードの設定については、setFileSelectionMode を参照してください。

パラメータ:
  filter - 選択可能なファイルフィルタのリストに追加する FileFilter

引数にはどのようなフィルタを行うかを表すFileFilterクラスのオブジェクトを指定します。

FileFilterクラスはabstractクラスとなっており自分でFileFilterクラスを継承したサブクラスを作成して利用します。ではまずFileFilterクラスについて見ておきます。(J2SE1.6以降では実装クラスが用意されています。こちらは次のページで見ていきます)。

FileFilterクラス

FileFilterクラスの定義を確認します。クラス図は次のようになっています。

java.lang.Object
  javax.swing.filechooser.FileFilter

public abstract class FileFilter extends Object

定義が必要なメソッドは2つあります。「accept」メソッドと「getDescription」メソッドです。

「accept」メソッド:

public abstract boolean accept(File f)

このフィルタが指定されたファイルを受け付けるかどうかを返します。

「accept」メソッドでは引数で渡されてきたFileクラスのオブジェクトに対して、表示するかどうかを判別して表示する場合には「true」、表示しない場合には「false」を返すようなメソッドを定義します。

例えば引数で渡されてきたFileクラスのオブジェクトからファイル名を取得し、さらに拡張子を取り出して条件文を記述します。

「getDescription」メソッド:

public abstract String getDescription()

このフィルタの説明です。たとえば、「JPG and GIF Images」のようになります。

「getDescription」メソッドでは作成したフィルタの簡単な説明を返すメソッドを定義します。ここで設定した説明はダイアログが表示された時にファイルタイプの箇所に表示されます。

下記はファイルの拡張子が「html」か「htm」だった場合だけ表示する簡単なフィルタを定義したクラスです。(API解説に記載されていたサンプルをベースに作成しました)。

import java.io.File;
import javax.swing.filechooser.FileFilter;

public class HtmlFilter extends FileFilter{

  public boolean accept(File f){
    /* ディレクトリなら無条件で表示する */
    if (f.isDirectory()){
      return true;
    }

    /* 拡張子を取り出し、html又はhtmだったら表示する */
    String ext = getExtension(f);
    if (ext != null){
      if (ext.equals("html") || ext.equals("htm")){
        return true;
      }else{
        return false;
      }
    }

    return false;
  }

  public String getDescription(){
    return "HTMLファイル";
  }

  /* 拡張子を取り出す */
  private String getExtension(File f){
    String ext = null;
    String filename = f.getName();
    int dotIndex = filename.lastIndexOf('.');

    if ((dotIndex > 0) && (dotIndex < filename.length() - 1)){
      ext = filename.substring(dotIndex + 1).toLowerCase();
    }
      
    return ext;
  }
}

実際の使い方

FileFilterクラスのサブクラスを定義したら「setFileFilter」メソッドの引数に作成したクラスのオブジェクトを指定します。

実際の使い方は次のようになります。(下記のHtmlFilterクラスは自分で定義したクラスです)。

JFileChooser filechooser = new JFileChooser();
filechooser.addChoosableFileFilter(new HtmlFilter());

int selected = filechooser.showOpenDialog(this);

サンプルプログラム

では簡単なサンプルを作成して試してみます。

JFileChooserTest12.java

import javax.swing.*;
import java.io.File;
import java.awt.BorderLayout;
import java.awt.event.*;

public class JFileChooserTest12 extends JFrame implements ActionListener{

  JLabel label;

  public static void main(String[] args){
    JFileChooserTest12 frame = new JFileChooserTest12();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  JFileChooserTest12(){
    JButton button = new JButton("file select");
    button.addActionListener(this);

    JPanel buttonPanel = new JPanel();
    buttonPanel.add(button);

    label = new JLabel();

    JPanel labelPanel = new JPanel();
    labelPanel.add(label);

    getContentPane().add(labelPanel, BorderLayout.CENTER);
    getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
  }

  public void actionPerformed(ActionEvent e){
    JFileChooser filechooser = new JFileChooser("c:\\temp");
    filechooser.addChoosableFileFilter(new HtmlFilter());

    int selected = filechooser.showOpenDialog(this);
    if (selected == JFileChooser.APPROVE_OPTION){
      File file = filechooser.getSelectedFile();
      label.setText(file.getName());
    }
  }
}

HtmlFilter.java

import java.io.File;
import javax.swing.filechooser.FileFilter;

public class HtmlFilter extends FileFilter{

  public boolean accept(File f){
    if (f.isDirectory()){
      return true;
    }

    String ext = getExtension(f);
    if (ext != null){
      if (ext.equals("html") || ext.equals("htm")){
        return true;
      }else{
        return false;
      }
    }

    return false;
  }

  public String getDescription(){
    return "HTMLファイル";
  }

  private String getExtension(File f){
    String ext = null;
    String filename = f.getName();
    int dotIndex = filename.lastIndexOf('.');

    if ((dotIndex > 0) && (dotIndex < filename.length() - 1)){
      ext = filename.substring(dotIndex + 1).toLowerCase();
    }
      
    return ext;
  }
}

上記の2つのファイルコンパイルした後で「java JFileChooserTest12」と実行すると次のように表示されます。

JFileChooserで表示するファイルをフィルタする

ボタンをクリックするとダイアログが表示されます。

JFileChooserで表示するファイルをフィルタする

表示されるファイルは、適用したフィルタで表示するように設定されたファイルだけが表示されています。今回の場合は「html」又は「htm」の拡張子を持つファイルだけ(ディレクトリは無条件で表示)です。またダイアログのファイルタイプにはフィルタクラスでフィルタの説明として定義した「HTMLファイル」が表示されています。

ファイルタイプのコンボボックスで適用されるフィルタを選択することができます。

JFileChooserで表示するファイルをフィルタする

デフォルトで用意されている「すべてのファイル」を選択すると(隠しファイルを除く)全てのファイルが表示されます。

JFileChooserで表示するファイルをフィルタする

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。