コモンダイアログ

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

詳細は次のリンクで調べましょう。

ファイルを開く JFileChooserのshowOpenDialogメソッド

最も簡単な使い方を示します。
ボタンクリックで実行させるイメージで示しています。

	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クラスは、 acceptgetDescriptionが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です。
このクラスのオブジェクトを次のように、 setFileFilteraddChoosableFileFilterで 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());
		}
	}
}

ファイル保存に使うJFileChooserのshowSaveDialogメソッド

次の表示を行うファイル保存ダイアログです。


単純に前述のshowOpenDialogをshowSaveDialogメソッドに変更するだけで表示できます。
但し、MyFilterMyPropertyChangeMyFileViewの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だけです。 なお、各種機能追加をしないのであれば、ページ先頭で示したコードの showOpenDialogshowSaveDialogメソッドに変更するだけです。

フォルダを選択するダイアログ表示

この場合には、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,"選択しませんでした");
		}
	}

このコードのボタン→ で、表示するダイアログを確認ください。

以上の各プログラムを確認したらこのボタンをクリックください。→