↓↓クリックして頂けると励みになります。
【42 | 軽量コンテナ】 << 【ホーム】 >> 【44 | JFileFilterとLook&Feel】
通常システムからの知らせに応じてユーザーが反応する場合(例えば、システムからの「本当にファイルを消してもよいですか?」に対する反応で「はい」「いいえ」を選択)は、「ダイアログ(対話)・ウィンドウ」と呼ばれるものを表示します。
Swingではダイアログウィンドウを生成する際はJDialogクラスを使用します。
JDialogクラスはSwingでは数少ない「重量コンポーネント(コンテナ)」です。
他にはJWindowとJFrameがあります。
Visual Studio Codeで以下のプログラムを作成してください。
新規作成 【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の主な違いをまとめておきます。
JWindow | JFrame | JDialog | |
---|---|---|---|
ユーザーによるサイズ変更 | × | ○ | ○ |
メニューバー | × | ○ | × |
タイトルバー | × | ○ | ○ |
アイコン化 | × | ○ | × |
オーナー(フレーム等)の指定 | ○ | × | ○ |
作成したプログラムを実行します。
フレームの他にもう1つダイアログが表示されます。
~/Desktop/Programming/JP $ javac SwingJDialogTest.java ~/Desktop/Programming/JP $ java SwingJDialogTest
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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 | メッセージの書式を設定
|
optionType | ダイアログボックスの下に表示されるオプションボタンのセット
|
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」と表示され、了解を押すと名前を聞かれます。
名前を入力し了解を押すと、今度は、性別を聞かれます。
男だったら「はい」を押してください。
コマンドプロンプト上に名前と性別が表示されます。
~/Desktop/Programming/JP $ javac SwingJOptionPaneTest1.java ~/Desktop/Programming/JP $ java SwingJOptionPaneTest1
ターミナルを確認します。
Name = プログラミングの鬼 male
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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」というメッセージが表示されます。
~/Desktop/Programming/JP $ javac SwingJFileChooserTest1.java ~/Desktop/Programming/JP $ java SwingJFileChooserTest1
【42 | 軽量コンテナ】 << 【ホーム】 >> 【44 | JFileFilterとLook&Feel】
↓↓クリックして頂けると励みになります。