倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

JFileChooser の使い方が悩ましいくらい分かりにくい!

Swing アプリケーションでファイルを選択したいときに使う javax.swing.JFileChooser。 ファイル選択ダイアログは複雑なので JFileChooser の使い方が分かりにくいのは仕方ないかとも思いますが、ちょっと手軽に使うには込み入ったドキュメントしか見当たらなかったので使い方を整理。 書いてるうちにこの記事も充分分かりにくくなりましたが、普通に使う分にはサンプルコードのコピペで充分かと。

ちなみに JFileChooser のダイアログはこんなの:

参考 URL:

記事の構成は

  1. サンプルコード
  2. JFileChooser のプロパティ
  3. ダイアログを表示するメソッド

です。

サンプルコード


プログラムの説明って「Sample is Best.*1だと思ってるので、とりあえずサンプルコード。 細かなプロパティの説明などは後回しで。

Java

JFileChooser の使い方の手順はこんな感じ:

  1. JFileChooser オブジェクトを取得する
  2. JFileChooser を設定する
  3. ダイアログを表示する
  4. ダイアログを閉じられた際の結果で処理を行う

まぁ、敢えて書くほどのものでもありませんが。

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

JFrame parent = ...

JFileChooser fc = new JFileChooser();    // (1)

fc.setFileFilter(new FileNameExtensionFilter("*.png", "png"));    // (2)

if(fc.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION) {    // (3), (4)
    System.out.println("You chose to open this file: " + fc.getSelectedFile().getName());
}
  • コンストラクタには引数なし以外に、カレント・ディレクトリを指定するものなどもあります。 詳しくは API ドキュメント参照。
  • JFileChooser に設定できる項目は、以下の「JFileChooser のプロパティ」の項目参照。
  • ダイアログを表示させるためには、showOpenDialog(), showSaveDialog(), showDialog() メソッドを使います。 詳しくは以下の「ダイアログを表示させるメソッド」の項目参照。 引数の parent は null でも構いません。
  • showXxxDialog() メソッドの返り値としては APPROVE_OPTION, CANCEL_OPTION, ERROR_OPTION があります。 いずれも JFileChooser の static フィールド(int 型)として定義されてます。
  • 選択されたファイルは getSelectedFile() メソッドで取得できます。

Groovy + SwingBuilder

「Groovy + SwingBuilder」で JFileChooser を使う場合、Java のときの1番目「JFileChooser オブジェクトを取得する」、2番目「JFileChooser を設定する」を同時に行うのが普通でしょう。 別に別別に行っても問題はありませんが。 ダイアログの表示とそれ以降の処理は Java の場合と同じです。

import groovy.swing.SwingBuilder
import javax.swing.filechooser.FileFilter

def filter = [
                   getDescription: {-> "*.png"},
                   accept:{ file-> file ==~ /.*?\.png/ || file.isDirectory() }
                ] as FileFilter

def builder = new SwingBuilder()
def fc  = builder.fileChooser(dialogTitle:'Choose an PNG file', 
                                        fileSelectionMode:JFileChooser.FILES_ONLY, 
                                        fileFilter:filter)

if(fc.showOpenDialog() == JFileChooser.APPROVE_OPTION){
    println("You chose to open this file: " + fc.selectedFile.name)
}
  • 上記の例では FileFilter のインスタンスをクロージャの Map から作成しています。 ここに出ている FileFilter クラスは javax.swing.filechooser.FileFilter です(java.io.FileFilter ではない!)。 もちろん、Java のサンプルのように FileNameExtensionFilter クラスなどを使ってオブジェクトを取得しても構いません(というよりそっちの方が簡単)。

JFileChooser のプロパティ


では以降で JFileChooser の詳細を少々。 まずは JFileChooser のプロパティ。 ここのプロパティは概ね JavaBeans のプロパティと同じだと思いますが、参考にしたのは SwingBuilder.fileChooser に載っているプロパティです。

実際に表示されるダイアログとプロパティ(一部)の関係は下図の通り:

String 値

String 値のプロパティは特に説明の必要はないかと。

プロパティ 説明
dialogTitle String ダイアログのタイトル
approveButtonText String 選択ボタンのテキスト
approveButtonToolTipText String 選択ボタンのツールチップテキスト

int 値

int 型のプロパティは、JFileChooser に定義されている static フィールドを使います。 ニーモニック定数はスルー。

プロパティ 取り得る値 説明
fileSelectionMode int FILES_ONLY
DIRECTORIES_ONLY
FILES_AND_DIRECTORIES
ファイルのみ選択可
ディレクトリのみ選択可
ファイル、ディレクトリが選択可
dialogType int OPEN_DIALOG
SAVE_DIALOG
CUSTOM_DIALOG
「開く」ダイアログ
「保存する」ダイアログ
カスタム・ダイアログ
approveButtonMnemonic int

dialogType は showOpenDialog() / showSaveDialog() メソッドを使う分には設定の必要はありません。

File

選択されたファイルやカレント・ディレクトリを取得するメソッド。 大切です。

プロパティ 説明
selectedFile File 選択されたファイル
selectedFiles File[] 選択された複数のファイル
currentDirectory File JFileChooser が表示しているディレクトリ

FileFilter

FileFilter は拡張子でフィルターを行うものをセットするのが常だと思いますが、もともとそれ以外に「すべてのファイル」を許可する FileFilter が登録されてます。

プロパティ 説明
fileFilter FileFilter 使われている FileFilter
acceptAllFileFilter FileFilter 「すべてのファイル」を許可する FileFilter*2
choosableFileFilters FileFilter[] 選択可能な FileFilter の List

boolean 値

boolean 値のプロパティはアクセッサ・メソッドが isXxxx() なのに注意。 ただし、dragEnabled プロパティのアクセッサは getDragEnabled() です。

プロパティ 説明
fileSelectionEnabled boolean ファイル選択の可/不可
multiSelectionEnabled boolean 複数ファイル選択の可/不可
directorySelectionEnabled boolean ディレクトリ選択の可/不可
fileHidingEnabled boolean 隠れファイルの非表示/表示
dragEnabled boolean ドラッグ可/不可
controlButtonsAreShown boolean APPROVE ボタン、キャンセルボタンの表示/非表示
acceptAllFileFilterUsed boolean 「すべてのファイル」を許可する Filter の使用/不使用

その他

その他のプロパティ。 この記事では扱いません。

プロパティ
fileView FileView
fileSystemView FileSystemView
UI FileChooserUI
accessory JComponent

ダイアログを表示するメソッド


ダイアログを表示させるメソッドには以下の3つがあります:

    int showOpenDialog(Component parent)
    int showSaveDialog(Component parent)
    int showDialog(Component parent, String approveButtonText)

普通に使う分には

  • ファイルを開く → showOpenDialog()
  • ファイルを保存する → showSaveDialog()

を使うのが無難でしょう。 これらの違いはダイアログのタイトルと APPROVE ボタンのテキストだけです(たぶん)。 引数の Component (親コンポーネント)は null でも動作します。

返り値

showXxxxDialog() メソッドの返り値の int は JFileChooser に定義されている int 型の static フィールドです:

  • APPROVE_OPTION・・・APPROVE ボタンが押された場合
  • CANCEL_OPTION・・・キャンセル・ボタンが押された場合、もしくはダイアログが×で閉じられた場合
  • ERROR_OPTION・・・エラーが発生した場合

ちなみに、JFileChooser には似た名前の static フィールド

  • APPROVE_SELECTION
  • CANCEL_SELECTION

が定義されていて分かりにくい!ですが、これらはイベント名などに使われるようなので、直接使うことはないかと思います。 フィールドの型がString 型なので間違っててもコンパイラが教えてくれるかと思いますが。

showXxxxDialog() メソッドが3つあるのと、XXXX_OPTION と XXXX_SELECTION フィールドがややこしいって点が JFileChooser で悩ましいところですが、分かってしまえばなんてことはないですね。 良かれと思って定義してあるんでしょうし。 これらに気を付ければ良い JFileChooser ライフが送れるかと。

Java Swing Hacks ―今日から使える驚きのGUIプログラミング集

Java Swing Hacks ―今日から使える驚きのGUIプログラミング集

*1:というより「Simple sample is Best.」と言った方がイイかな。 別に親父ギャグのつもりではなく。

*2:Groovy のみ。