Javaの場合、コモンダイアログという呼び方をしませんが、
Javaシステムのアプリケーションで共通に使える専用ダイアログが用意されています。
それは、ファイルの選択や保存に使われるJFileChooserや色選択に使うJColorChooserです
構造は次のようになっています。
java.lang.Object └java.awt.Component └java.awt.Container └javax.swing.JComponent └javax.swing.JFileChooser |
java.lang.Object └java.awt.Component └java.awt.Container └javax.swing.JComponent └javax.swing.JColorChooser |
詳細は次のリンクで調べましょう。
最も簡単な使い方を示します。
ボタンクリックで実行させるイメージで示しています。
public void actionPerformed(ActionEvent e) { javax.swing.JFileChooser chooser = new javax.swing.JFileChooser(); int returnVal = chooser.showOpenDialog(this); if (returnVal == javax.swing.JFileChooser.APPROVE_OPTION)//「yes」や「ok」が選択か? { javax.swing.JOptionPane.showMessageDialog(this, "選択したファイル: " + chooser.getSelectedFile().getName()); } }
showOpenDialogメソッドで次のようなファイル選択ダイアログが表示できます。
この表示で、「yes」や「ok」をクリックしてファイルを選択した場合の戻り値が、
クラス変数でJFileChooser.APPROVE_OPTIONの値のint型です。
なお、thisの部分が親のオブジェクトで、
このオブジェクトに重なるようにダイアログが表示されます。
nullの指定も可能で、その時はデフォルト位置へ表示することになります。
ここで、chooser.getSelectedFile()のメソッド戻り値は、
java.io.Fileクラスのオブジェクトです。
このオブジェクトのgetName()メソッドで
選択いたファイル名が取得できます。
絶対パスのFileオブジェクトを取得する場合は、getAbsoluteFile()メソッドを使います。
以下にFileクラスでよく使われるその他の命令を紹介します。
なお、FileInputStreamやFileOutputStreamのコンストラクタでは、このFILEのオブジェクトを指定するコンストラクタ(ストリームをオープンする)が存在します。
Fileクラスのコンストラクタやメソッド | 概要 |
---|---|
File(String directory, String file) | directoryのディレクトリとfileで生成するコンストラクタ |
createTempFile(String prefix, String suffix, File directory) | directoryのディレクトリに一時ファイルを作成する際のstaticメソッド |
String getPath() | ファイルやディレクトリのパスを取得 |
boolean delete() | ファイルやディレクトリの削除メソッド |
boolean exists() | 実際にそのファイルが存在するか調べる |
isDirectory() | ディレクトリか調べる |
isDirectory() | ディレクトリか調べる |
long length() | ファイルのサイズ(byte)を取得する |
さて、上記のJFileChooserオブジェクトでは、初期のディレクトリやファイル名の指定、そして
ファイルの種類を指定するフィルタがありません。以下で、それら指定を行ってファイルを選択するプログラム例を
示します。
ここでは、画像ファイルとして、『.gif』、『.jpg』のフィルタを指定し、
My Documentsの中のMy Picturesを初期ディレクトリに指定し、
初期ファイル名をtemp.gifにする例を示します。
まずフィルタですが、それには『javax.swing.filechooser.FileFilter』クラスを継承した
クラスを次のように作って、それを指定する形態です。
(スーパークラスのFileFilterクラスは、
acceptとgetDescriptionがabustract(宣言だけの)メソッドです。
これは抽象クラスと呼ばれ、new で生成することができないクラスです。
次のように継承クラスをオーバーライドして実体を作ること利用するクラスです。
//JFileChooserで表示するFileのどれを見せるかを指定するフィルタークラス class MyFilter extends javax.swing.filechooser.FileFilter { String description;//ファイル選択の説明のリスト用 String extension;//ファイル選択の拡張子 public MyFilter(String description, String extension)//コンストラクタ { this.description = description;//ファイル選択の説明 this.extension = extension;//ファイル選択の拡張子 } public boolean accept(java.io.File f)//fのファイルが見せるべきファイルならtrueを返す。 { if (f.isDirectory()) return true;//ディレクトリなら見せる String fname = f.getName(); int idx = fname.lastIndexOf('.');//拡張子を求めるためのドット位置取得 if(idx != -1){ String ext = fname.substring(idx + 1);//拡張子の文字列取得 ext = ext.toLowerCase(); //小文字に変換 return ext.equals(this.extension);//拡張子が合えば表示させる } return false;//fのファイルは表示させない } public String getDescription(){ return this.description;//ファイルの説明のリスト用 } }
ファイルを表示するかしないかを決めるメソッドが
acceptで、ファイルタイプのリストに表示する文字列指定がgetDescriptionです。
このクラスのオブジェクトを次のように、
setFileFilterやaddChoosableFileFilterで
JFileChooserに指定することにより、
その中に表示するファイルに選ばせます。
public void actionPerformed(ActionEvent e) { javax.swing.JFileChooser chooser = new javax.swing.JFileChooser(); javax.swing.filechooser.FileFilter filter1 = new MyFilter("GIF画像", "gif"); javax.swing.filechooser.FileFilter filter2 = new MyFilter("JPG画像", "jpg"); chooser.setFileFilter(filter1);//フィルターのセット chooser.addChoosableFileFilter(filter2);//フィルターの追加 String myDir = System.getProperty("user.home");//ユーザーのホームディレクトリ取得 myDir += "\\My Documents\\My Pictures"; chooser.setCurrentDirectory(new java.io.File(myDir));//chooserの初期ディレクトリを指定 chooser.setSelectedFile(new java.io.File("temp.gif"));//初期の選択ファイル名を指定 int returnVal = chooser.showOpenDialog(this);//ファイルオープンダイアログ表示 if (returnVal == javax.swing.JFileChooser.APPROVE_OPTION) { javax.swing.JOptionPane.showMessageDialog(this, "選択したファイル: " + chooser.getSelectedFile().getAbsoluteFile()); } }
setCurrentDirectoryにより、初期のディレクトリが変更されていますが、
カレントディレクトリを指定する場合は、new File(".")を指定します。
(表示時のタイトルを変更する場合は、setDialogTitle("title")メソッドを使います)
そして、setSelectedFileのファイル名が選択状態になり、ファイルタイプが『JPG画像』となり
その画像だけが見える状態で、次のようなダイアログ表示になります。
そしてJFileChooserには、
java.beans.PropertyChangeListenerインターフェイス実装クラスのオブジェクトを
setAccessoryメソッドで指定することで、アクセサリと呼ばれる機能拡張ができます。
これにより、例えば次のように画像プレビューなどが行えるダイアログにできます。
PropertyChangeListenerインターフェイスの役割は、JFileChooserなどを操作して
ファイルを選んだ時に変更処理するpropertyChangeメソッドを提供ことです。
つまり、利用者はこのpropertyChangeメソッドで、変更対象を変更するプログラムを書きます。
以下に、この変更対象となる画像表示用JLabelを入れたJScrollPaneを継承し、
PropertyChangeListenerインターフェイスを実装したクラスの例を示します。
class MyPropertyChange extends javax.swing.JScrollPane implements java.beans.PropertyChangeListener { JLabel label = new javax.swing.JLabel();// 画像表示用のラベル javax.swing.JFileChooser chooser;//この配置するJFileChooserオブジェクト管理用 public MyPropertyChange(javax.swing.JFileChooser parent) { setViewportView(this.label);//自身のJScrollPaneで使う表示用のラベルをセット this.chooser = parent;//利用するJFileChooserをセット this.setPreferredSize(new java.awt.Dimension(150, 0));//希望サイズ指定 } public void propertyChange(java.beans.PropertyChangeEvent evt) { java.io.File file = chooser.getSelectedFile();//選択したファイルを取得 if (file == null) return; this.label.setIcon(new javax.swing.ImageIcon(file.getPath()));ラベルにアイコンをセット } }
コンストラクタで、使用するJFileChooserを引数にしています。
JFileChooserでファイルを選んだ時に、選んだファイルをpropertyChangeメソッドで使うために
インスタンス変数へ記憶しています。
propertyChangeメソッドでは、このJFileChooserオブジェクトからgetSelectedFileメソッドで
ファイルを取得し、ファイルからアイコンをイメージ取得してペイントするImageIconを生成し、
それをラベルにsetIconで設定することで描画させています。
なお、コンストラクタで自身の希望のサイズをsetPreferredSizeメソッドで指定しています。
これは希望のサイズで、これを使うJFileChooserオブジェクトで実際のサイズが決まります。
Dimensionクラスは幅と高さ管理するクラスで、Dimension(150, 0)と指定していますが、高さの0は
JFileChooserオブジェクトによって適当に決められるという訳です。
(たくさんのクラスを利用していますが、
で調べて使うレベルのコードです。)
以下にこのクラスを使うJFileChooserのshowOpenDialogメソッド利用例を示します。
の部分が追加したコードです。
public void actionPerformed(ActionEvent e)
{
javax.swing.JFileChooser chooser = new javax.swing.JFileChooser();
javax.swing.filechooser.FileFilter filter1 = new MyFilter("GIF画像", "gif");
javax.swing.filechooser.FileFilter filter2 = new MyFilter("JPG画像", "jpg");
chooser.setFileFilter(filter1);//フィルターのセット
chooser.addChoosableFileFilter(filter2);//フィルターの追加
String myDir = System.getProperty("user.home");
myDir += "\\My Documents\\My Pictures";
chooser.setCurrentDirectory(new java.io.File(myDir));
chooser.setSelectedFile(new java.io.File("temp.gif"));//初期の選択ファイル名
MyPropertyChange pane = new MyPropertyChange(chooser);//アクセサリ実現用クラス生成
chooser.setAccessory(pane);//アクセサリ用の描画領域オブジェクトセット
chooser.addPropertyChangeListener(pane);//アクセサリ用インターフェイス実装オブジェクトをセット
int returnVal = chooser.showOpenDialog(this);
if (returnVal == javax.swing.JFileChooser.APPROVE_OPTION)
{
javax.swing.JOptionPane.showMessageDialog(this,
"選択したファイル: " + chooser.getSelectedFile().getAbsoluteFile());
}
}
またJFileChooserは、選択するファイルをどのように表示するか、
指定することができます。
例えば、『.jpg』のファイル表示にjpg.gifの画像()
使って次のように表示できます。
そのためには、javax.swing.filechooser.FileView の抽象クラスを使うことになります。
これは、JFileChooserで使うファイル情報を提供するクラスで、
ファイルアイコン情報提供するjavax.swing.Icon getIcon(java.io.File f)メソッドを
オーバーライドすることで実現します。
以下にそのクラスの例を示します。(jpg.gifのファイルがこのクラスファイルと同じ位置ある場合の指定です)
class MyFileView extends javax.swing.filechooser.FileView { javax.swing.Icon icon;//『.jpg』ファイルに使うアイコン public MyFileView() { java.net.URL urlIcon = this.getClass().getResource("jpg.gif");//アイコンファイルのURL生成 this.icon = new javax.swing.ImageIcon(urlIcon);//アイコンファイルからアイコンを取得 } public javax.swing.Icon getIcon(java.io.File f)//fに使うファイルアイコンを指定します。 { if (f.getName().toLowerCase().endsWith(".jpg")) return icon; else return null; } }
そして、このクラスのオブジェクトを、 setFileViewメソッドで、次のように指定する記述を追加すれば反映します。
public void actionPerformed(ActionEvent e) { javax.swing.JFileChooser chooser = new javax.swing.JFileChooser(); javax.swing.filechooser.FileFilter filter1 = new MyFilter("GIF画像", "gif"); javax.swing.filechooser.FileFilter filter2 = new MyFilter("JPG画像", "jpg"); chooser.setFileFilter(filter1);//フィルターのセット chooser.addChoosableFileFilter(filter2);//フィルターの追加 String myDir = System.getProperty("user.home"); myDir += "\\My Documents\\My Pictures"; chooser.setCurrentDirectory(new java.io.File(myDir)); chooser.setSelectedFile(new java.io.File("temp.gif"));//初期の選択ファイル名 MyPropertyChange pane = new MyPropertyChange(chooser);//アクセサリ実現用クラス生成 chooser.setAccessory(pane);//アクセサリ用の描画領域オブジェクトセット chooser.addPropertyChangeListener(pane);//アクセサリ用インターフェイス実装オブジェクトをセット chooser.setFileView(new MyFileView()); int returnVal = chooser.showOpenDialog(this); if (returnVal == javax.swing.JFileChooser.APPROVE_OPTION) { javax.swing.JOptionPane.showMessageDialog(this, "選択したファイル: " + chooser.getSelectedFile().getAbsoluteFile()); } } }
次の表示を行うファイル保存ダイアログです。
単純に前述のshowOpenDialogをshowSaveDialogメソッドに変更するだけで表示できます。
但し、MyFilter、
MyPropertyChange、
MyFileViewの3つのクラスは、上記で作ったように存在していなければなりません。
以下にそのコード例を示します。
public void actionPerformed9(ActionEvent e) { javax.swing.JFileChooser chooser = new javax.swing.JFileChooser(); javax.swing.filechooser.FileFilter filter1 = new MyFilter("GIF画像", "gif"); javax.swing.filechooser.FileFilter filter2 = new MyFilter("JPG画像", "jpg"); chooser.setFileFilter(filter1);//フィルターのセット chooser.addChoosableFileFilter(filter2);//フィルターの追加 String myDir = System.getProperty("user.home"); myDir += "\\My Documents\\My Pictures"; chooser.setCurrentDirectory(new java.io.File(myDir)); chooser.setSelectedFile(new java.io.File("temp.gif"));//初期の選択ファイル名 MyPropertyChange pane = new MyPropertyChange(chooser);//アクセサリ実現用クラス生成 chooser.setAccessory(pane);//アクセサリ用の描画領域オブジェクトセット chooser.addPropertyChangeListener(pane);//アクセサリ用インターフェイス実装オブジェクトをセット chooser.setFileView(new MyFileView()); int returnVal = chooser.showSaveDialog(this); if (returnVal == javax.swing.JFileChooser.APPROVE_OPTION) { javax.swing.JOptionPane.showMessageDialog(this, "選択したファイル: " + chooser.getSelectedFile().getAbsoluteFile()); } }
変更したのは、showSaveDialogだけです。 なお、各種機能追加をしないのであれば、ページ先頭で示したコードの showOpenDialogをshowSaveDialogメソッドに変更するだけです。
この場合には、showDialog(this, "選択")で表示させます。
またこの表示前にsetFileSelectionModeで、
JFileChooser.DIRECTORIES_ONLYを指定することで、
ディレクトリだけが見えて選択できるように変更しています。
そして、タイトルバーの表示文字列もsetDialogTitleで変更しています。
public void actionPerformed(ActionEvent e) { javax.swing.JFileChooser chooser = new javax.swing.JFileChooser(); chooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY); chooser.setDialogTitle("フォルダ選択"); String myDir = System.getProperty("user.home"); myDir += "\\My Documents"; chooser.setCurrentDirectory(new java.io.File(myDir)); int returnVal = chooser.showDialog(this, "選択"); if (returnVal == javax.swing.JFileChooser.APPROVE_OPTION) { javax.swing.JOptionPane.showMessageDialog(this, "選択したフォルダ: " + chooser.getSelectedFile().getAbsoluteFile()); } }
このactionPerformedの実行で表示したダイアログの例を以下に示します。
色選択に使うJColorChooserの例です。
モーダルなカラーチューザダイアログ(カラー選択ダイアログ)を表示では、
showDialogメソッドを使います。
この引数では、親となる部品と、タイトルバーに表示する文字列と、
初期の色を指定します。
色を選択して、OKを選んだ時は戻り値が選択したColorクラスのオブジェクトになります。
それ以外のキャンセルなどを選択した場合は、nullが返ります。
(なお、createDialogメソッドを使って生成した場合は、モードレスのダイアログも作れます。)
public void actionPerformed(ActionEvent e)
{
javax.swing.JColorChooser chooser = new javax.swing.JColorChooser();
java.awt.Color intColor = new java.awt.Color(0,0,255); //初期の青
java.awt.Color color = chooser.showDialog(this,"色を選択ください",intColor);
if(color != null){
javax.swing.JOptionPane.showMessageDialog(this,
"選択した色: " + color.toString());
} else {
javax.swing.JOptionPane.showMessageDialog(this,"選択しませんでした");
}
}
このコードのボタン→ で、表示するダイアログを確認ください。
以上の各プログラムを確認したらこのボタンをクリックください。→