Swing アプリケーションでファイルを選択したいときに使う javax.swing.JFileChooser。 ファイル選択ダイアログは複雑なので JFileChooser の使い方が分かりにくいのは仕方ないかとも思いますが、ちょっと手軽に使うには込み入ったドキュメントしか見当たらなかったので使い方を整理。 書いてるうちにこの記事も充分分かりにくくなりましたが、普通に使う分にはサンプルコードのコピペで充分かと。
ちなみに JFileChooser のダイアログはこんなの:
参考 URL:
記事の構成は
- サンプルコード
- JFileChooser のプロパティ
- ダイアログを表示するメソッド
です。
サンプルコード
プログラムの説明って「Sample is Best.」*1だと思ってるので、とりあえずサンプルコード。 細かなプロパティの説明などは後回しで。
Java
JFileChooser の使い方の手順はこんな感じ:
- JFileChooser オブジェクトを取得する
- JFileChooser を設定する
- ダイアログを表示する
- ダイアログを閉じられた際の結果で処理を行う
まぁ、敢えて書くほどのものでもありませんが。
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プログラミング集
- 作者: Joshua Marinacci,Chris Adamson,神戸博之(監訳),島田秋雄(監訳),加藤慶彦
- 出版社/メーカー: オライリージャパン
- 発売日: 2006/04/01
- メディア: 単行本(ソフトカバー)
- 購入: 7人 クリック: 100回
- この商品を含むブログ (38件) を見る