学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その42 JDialog, JOptionPane, JFileChooserの利用

<<前  [TOP]  次>>


通常、システムからの知らせに応じてユーザーが反応する場合(例えば、システムからの「本当にファイルを消してもよいですか?」に対する反応で「はい」「いいえ」を選択)は、「ダイアログ(対話)・ウィンドウ」と呼ばれるものを表示します。


Swingではダイアログウィンドウを生成する際は、JDialogクラスを使用します。
JDialogクラスは、Swingでは数少ない「重量コンポーネント(コンテナ)」です。
他には、JWindowとJFrameがあります。


まず、以下のサンプルプログラムを作成してみましょう。


SwingJDialogTest.java 直

import javax.swing.*;

public class SwingJDialogTest {

	/**コンストラクタ*/
	public SwingJDialogTest() {
		JFrame frame = new JFrame("JDialogTest");
		frame.setSize(400,300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);

		JLabel label = new JLabel("DialogTest");

		//ダイアログウィンドウの生成(frameがオーナー)
		JDialog dialog = new JDialog(frame, "Dialog Title");

		//ダイアログのウィンドウにラベルを付加
		dialog.getContentPane().add(label,"Center");

		//ラベルの大きさに合わせてダイアログウィンドウのサイズを設定
		dialog.pack();		
		dialog.setVisible(true); //ダイアログウィンドウの表示
	}
	
	/**main()*/
	public static void main(String[] args) {
		new SwingJDialogTest();
	}
}



JDialogで初期設定されているレイアウトはボーダーレイアウトですから、フレームと同様にコンポーネントを配置することができます。

JLabel label = new JLabel("ラベル");
JDialog dialog = new JDialog();    //ダイアログを生成

//ラベルをダイアログに設定
dialog.getContentPane().add(label, "Center");
dialog.pack();    //最小範囲で最適化
dialog.setVisible(true);    //ダイアログを表示



ただし、通常JDialogを生成する場合には、オーナーにあたるフレームかダイアログを指定することが多いでしょう。
基になるアプリケーションからの知らせに応じて、ダイアログウィンドウがユーザーに確認を求めるので当然といえば当然でしょう。


【コンストラクタの生成の一例】

JFrame frame = new JFrame("フレーム");

//フレームをオーナーとしてタイトル付で生成(タイトル無しでも生成可能)
JDialog dialog = new JDialog(frame, "ダイアログ・タイトル");



Swingの重量コンポーネントJWindow, JFrame, JDialogの主な違いをまとめておきます。

JWindowJFrameJDialog
ユーザーによるサイズ変更×
メニューバー××
タイトルバー×
アイコン化××
オーナー(フレーム等)の指定×


では、サンプルプログラムを実行してみましょう。
フレームの他にもう一つダイアログが表示されます。








以下のサンプルプログラムを作成してみましょう。


SwingJOptionPaneTest1.java 直

/**オプションペインのテスト*/
import javax.swing.*;

public class SwingJOptionPaneTest1 {
	/**コンストラクタ*/
	public SwingJOptionPaneTest1() {
		JFrame frame = new JFrame("JOptionPaneTest1");
                frame.setSize(400,300);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);

		//文字列の表示。オーナーはデフォルトのフレーム
		JOptionPane.showMessageDialog(null, "JOptionPane1", "test", JOptionPane.ERROR_MESSAGE);

		//文字列の入力。値はnameに代入
		String name = JOptionPane.showInputDialog(null,"Please input your name.");
		System.out.println("Name = "+ name);

		//「Yes」「No」「Cancel」を選択。値は「JOptionPane.oo_OPTION」
		int ans = JOptionPane.showConfirmDialog(null, "Are You a male?");
		if(ans == JOptionPane.YES_OPTION) {
			System.out.println("male");
		}
		else if(ans == JOptionPane.NO_OPTION) {
			 System.out.println("female");
                }
		else if(ans == JOptionPane.CANCEL_OPTION) {
                         System.out.println("cancel");
                }
	}
	/**main() */
	public static void main(String[] args) {
		new SwingJOptionPaneTest1();
	}
}



オプションペインはJOptionPaneクラスによって生成される、ダイアログボックス表示するコンポーネントです。
オプションペインを使用することで、ユーザーの応答を求める単純なダイアログウィンドウなら、手間無く生成することができます。


JOptipnPaneは多様なメッセージ表示ができます。
通常は、以下のように「show○○Dialog()」というstaticなメソッドを直接呼び出せばよいです。

showConfirmDialog()yes/no/cancel等の確認要求
showInputDialog()入力プロンプト
showMessageDialog()ユーザーへのメッセージ
showOptionDialog()上の3つを合わせたもの


これらメソッドはユーザーからの応答があるまで、他の処理を行わせません。


以下の例は、オーナーを指定せずにダイアログボックスを表示します。
ダイアログボックスには「エラー」という文字列が表示されています。
オーナーが無い場合、通常ダイアログボックスの表示は、ディスプレイの中央になります。
オーナーが指定されていれば、オーナーの中央に表示されます。

JOptionPane.showMessageDialog(null, "エラー");



メソッドには、以下のようなパラメータを記述します。

パラメータパラメータの意味
parentComponentオーナーとなるComponentの指定。
nullの時は初期設定のFrameを使用
messageダイアログボックスに表示するメッセージ。
ただし、実際はObject型なので、String型意外にもIconなども使用可能
messageTypeメッセージの書式を設定
  • ERROR_MESSAGE
  • INFORMATION_MESSAGE
  • WARNING_MESSAGE
  • QUESTION_MESSAGE
  • PLAIN_MESSAGE
optionTypeダイアログボックスの下に表示されるオプションボタンのセット
  • DEFALT_OPTION
  • YES_NO_OPTION
  • YES_NO_CANCEL_OPTION
  • OK_CANCEL_OPTION
optionsダイアログボックスの下に表示されるオプションボタンの詳細な説明
iconダイアログボックスに配置するアイコン。
初期設定はmessageTypeの値で決まる
titleダイアログボックスのタイトル
initialValue選択値(入力値)を初期設定する


ユーザーからの答えが、選択(「YES」や「NO」など)に対するものだったときは、メソッドが返す値(整数)は、「YES_OPTION」「NO_OPTION」「CANCEL_OPTION」「OK_OPTION」「CLOSE_OPTION」のいずれかになります。

//エラーメッセージとして「読み込みを中断しました」と表示
//タイトルは「中断メッセージ」
JOptionPane.showMessageDialog(null, "読み込みを中断しました", 
    "中断メッセージ", JOptionPane.ERROR_MESSAGE);

//値入力を求める。値は「s」へ代入
String s = JOptionPane.showInputDialog(null, "何かを入力してください");

//「Yes」「No」「Cancel」を選択
//値はJOptionPane.「YES_OPTION」「NO_OPTION」「CANCEL_OPTION」
int a = JOptionPane.showConfirmDialog(null, "いずれかを選択してください");



では、サンプルプログラムを実行してみましょう。
まず、エラーメッセージが表示されます。
「JOptionPane1」と表示され、了解を押すと名前を聞かれます。
名前を入力し、了解を押すと、今度は、性別を聞かれます。
男だったら「はい」を押してください。
コマンドプロンプト上に、名前と性別が表示されます。

















以下のサンプルプログラムを作成してみましょう。


SwingJFileChooserTest1.java 直

/**ファイルチューザーのテスト*/
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class SwingJFileChooserTest1 implements ActionListener {

	private JFrame frame;
	private JMenu fileMenu;		//メニュー用
	private JMenuItem openItem, quitItem;
	private JLabel label;
	private ImageIcon image;
	private JFileChooser fileChooser;	//ファイルチューザー用

	/**コンストラクタ*/
	public SwingJFileChooserTest1() {
		image = null;			//初期設定のイメージは無し
		label = new JLabel(image);	//空のイメージをラベルに設定

		//ファイルチューザーを開いた時はカレントディレクトリにする
		fileChooser=new JFileChooser(".");

		//ファイルチューザーの見出し
		fileChooser.setDialogTitle("JPEG/GIF");

		//メニューの作成
		JMenuBar menuBar = new JMenuBar();
		fileMenu = new JMenu("FILE");
		openItem = new JMenuItem("Open");
		quitItem = new JMenuItem("Quit");

		fileMenu.add(openItem);
		fileMenu.addSeparator();
		fileMenu.add(quitItem);
		menuBar.add(fileMenu);

		//フレームの生成・表示
		frame = new JFrame("JFileChooserTest1");
                frame.setSize(400,300);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setJMenuBar(menuBar);
		frame.getContentPane().add(label,"Center");
                frame.setVisible(true);

		//イベントの登録
		openItem.addActionListener(this);
		quitItem.addActionListener(this);
	}

	/**メニューが選ばれた時の処理*/
	public void actionPerformed(ActionEvent evt){
		String str = evt.getActionCommand();

		if(str.equals("Open")) {
			fileOpen();
		}
		else if(str.equals("Quit")) {
			System.exit(0);
		}
	}

	/**「Open」を選択した時の処理*/
	public void fileOpen() {

		//「開く」「キャンセル」のチェック(オーナーはnull)
		int state = fileChooser.showOpenDialog(null);

		//選択されたファイルを設定
		File file = fileChooser.getSelectedFile();

		//ファイルが選択(「開く」)された。「file!=null」も忘れずに行う
		if(file != null && state == JFileChooser.APPROVE_OPTION) {

			//選択したファイルからパスを把握してimageを生成する
			image = new ImageIcon(file.getAbsolutePath());

			//ラベルにイメージを設定後、フレーム以下を再配置
			label.setIcon(image);
			frame.validate();
			frame.pack();
		}
		else if(state == JFileChooser.CANCEL_OPTION){
			JOptionPane.showMessageDialog(null,"Cancel!");
		}
		else if(state == JFileChooser.ERROR_OPTION){
			JOptionPane.showMessageDialog(null,"Error!");
		}
	}

	/**main()*/
	public static void main(String[] args){
		new SwingJFileChooserTest1();
	}
}	



エディタなどファイルを選択する必要があるアプリケーションを作成する場合、ユーザーがファイルを選択するための簡単な機構を提供する、JFileChooserクラスを利用すると便利です。
ファイルチューザーは、ディレクトリ内のファイル表示、表示ディレクトリの移動、ファイル選択、ファイル選択のキャンセルなどが実現できます。


以下に主な機能をまとめておきます。

ダイアログ「オープンダイアログ」「保存ダイアログ」「カスタムダイアログ」
表示モードファイルのみ、ディレクトリのみ、ファイルとディレクトリ
選択単一選択、複数選択
応答ボタン応答ボタンなどのカスタマイズが可能
ファイルフィルタ特定のファイル種類などを表示することが可能。


JFileChooserを単に生成した場合には、システムに依存したフォルダを開くことになります。

//Windowsなら「My Documents」フォルダ、
//Unixならユーザーのホームディレクトリを開く
JFileChooser fc = new JFileChooser();



また、生成する際にディレクトリを指定することも出来ます。

//カレントディレクトリを開く
JFileChooser fc = new JFileChooser(".");



生成したファイルチューザーの利用例

JFileChooser fc = new FileChooser(".");

//表示ダイアログの設定
fc.setDialogTitle("ファイル選択");
    :
//「オープン」モードでダイアログを表示(オーナーはnull)
int state = fc.showOpenDialog(null);

//選択されたファイル名を設定
File file = fc.getSelectedFile();

//ファイルが選択された(APPROVE OPTIONは「Yes」「Ok」)
//選択されているファイルがない場合もあるので「file != null」を忘れないこと
if (file != null && state == JFileChooser.APPROVE_OPTION) {
    //ファイルからイメージアイコンを生成
     ImageIcon image = new ImageIcon(file.getAbsolutePath());
 }
 else if ( state == JFileChooser.CANCEL_OPTION) {    //キャンセル
    :
}
else if ( state == JFileChooser.ERRORL_OPTION) {    //エラー
    :
} 



では、サンプルプログラムを実行してみましょう。
ファイルのオープンを選択することが出来ます。
「file」メニューから「open」を選択すると、ファイルの一覧が表示されます。
画像ファイルのあるフォルダへ移動し、ファイルを選択すると、選択した画像が表示されます。
取り消しを押すと、「cancel」というメッセージが表示されます。








<<前  [TOP]  次>>