GUIアプリ③色々なダイアログ

GUIアプリの連載の続きです。
今回は、色々なダイアログについてです。
子画面のイメージです。
色々な種類があるので、それぞれ学んでいきたいと思います。

ダイアログの種類を表に示します。

#ダイアログ種類説明
1一般的なダイアログ(JDialogクラス)一般的なダイアログ
2ファイル選択用のダイアログ(FileDialogクラス)ファイル選択用のダイアログ
3ユーザ入力用のダイアログ(JOptionPanクラスshowInputDialogメソッド①)ユーザ入力用のダイアログ
4ユーザ選択用のダイアログ(JOptionPanクラスshowInputDialogメソッド②)ユーザ選択用のダイアログ
5ユーザ確認用のダイアログ(JOptionPanクラスshowConfirmDialogメソッド)ユーザ確認用のダイアログ
6メッセージダイアログ(JOptionPanクラスshowMessageDialogメソッド)メッセージダイアログ
7色選択ダイアログ(JColorChooserクラス)色選択ダイアログ

■Javaソース資源

ファイル名概要修正/新規
1GuiVariousDialog.javaフレームクラス新規

■作成手順

#作成手順備考
1プロジェクトの作成プロジェクト名:GuiVarioustDialog
2Javaソースの作成・クラス
・コンストラクタ
・メイン
・アクションパフォームド

#1 プロジェクトの作成

#2 Javaソースの作成

クラス名:GuiVariousDialog
スーパークラス(継承元クラス):JFrame
インターフェイス:ActionListener
スーパークラスからのコンストラクタのチェックははずしています。(不要なコンストラクタが作成されるとことを防げます)

前回と同じように、実装されていないメソッドがあるので、エラーになっています。
「実装されていないメソッド」をクリックして、メソッド追加します。

行数説明
18クラス名:GuiVariousDialog
スーパークラス(継承元クラス):JFrame
継承元インターフェイス:ActionListener
21~29JButtonクラス(ボタン)1~7のインスタンスを生成しています。
※ボタン名は任意ですので、自由にわかりやすく変えてもらって大丈夫です。
例:子画面のボタン→dialogBtnなど
32~38JLabelクラス(ラベル)1~7ののインスタンスを生成しています。
※ラベル名は任意ですので、自由にわかりやすく変えてもらって大丈夫です。
例:子画面ラベル→daialogLabelなど

行数説明
41JDialogクラス(ダイアログ)のインスタンスを生成しています。
43JTextFieldクラス(テキストフィールド)のインスタンスを生成しています。
45~48メインメソッドになります。
GuiVariousDialogコンストラクタの呼び出しのみを行っています。

行数説明
49GuiVariousDialogコンストラクタになります。
51~57ボタン1~7のアクションリスナーの登録をしています。
60getContentPane()は、フレーム自身のコンテント・ペインを取得です。
setLayout(new GridLayout(7,2))は、グリッドレイアウト方式で、7行、2列で配置します。
61~74ボタン1~7とラベル1~7をフレーム自身のコンテント・ペインに配置してます。

行数説明
77フレーム自身のタイトルを「色々なダイアログ」に設定しています。
78フレーム自身の右上の「×」ボタン押下時に閉じるようにします。
79フレーム自身のサイズを幅500ピクセル、高さ300ピクセルに設定しています。
80フレーム自身を表示します。

行数説明
83オーバライドアノテーションになります。
84メソッド名:actionPerformed(アクションパフォームド)
引数:ActionEvent e(アクションイベント)
87アクションイベントがボタン1かどうか判別しています。
88ダイアログのコンテント・ペインをフローレイアウト方式に設定します。
90ダイアログにテキストフィールドを配置しています。
92ダイアログにOKボタンを配置しています。
94OKボタンをアクションリスナーに登録しています。
95ダイアログのタイトルバーに"子画面"を設定しています。
96ダイアログのサイズを幅300ピクセル、高さ200ピクセルに設定しています。
97ダイアログを表示します。
100アクションイベントが子画面のOKボタンかどうか判別しています。
101ラベル1に子画面のテキストフェールドのテキストを設定しています。
102ダイアログを閉じます。
行数説明
105アクションイベントがボタン2かどうか判別しています。
106FileDailog(ファイルダイアログ)のインスタンスを生成しています。
107ファイルダイアログのタイトルバーに"ファイル選択"を設定しています。
108ファイルダイアログのサイズを幅300ピクセル、高さ200ピクセルに設定しています。
109ファイルダイアログを表示します。
110ラベル2のテキストにファイルダイアログで選択したファイルのパスとファイル名を設定しています。
行数説明
113アクションイベントがボタン3かどうか判別しています。
114JOptionPaneクラスのshowInputDialogメソッドで、文字列入力のダイアログを表示します。
入力文字列を戻り値(str)として返します。
115ラベル3のテキストにダイアログで入力した文字列を設定しています。
118アクションイベントがボタン4かどうか判別しています。
119選択用の文字列(日本、アメリカ、イギリス)を設定しています。
120~123JOptionPaneクラス
showInputDialogメソッド
①引数:this :親ウインドウ
②引数:"選択してください":メッセージ
③引数:"input":タイトルバー
④引数:JOptionPane.INFORMATION_MESSAGE:メッセージタイプ
⑤引数:null:アイコンのイメージ
⑥引数:possibleValues:選択肢の文字列
⑦引数:possibleValues[0]:初期選択肢
124ラベル4のテキストにダイアログで選択した文字列を設定しています。

行数説明
127アクションイベントがボタン5かどうか判別しています。
128~130JOptionPaneクラス
showConfirmDialogメソッド
①引数:this :親ウインドウ
②引数:"メッセージ":メッセージ
③引数:"タイトル":タイトルバー
④引数:JOptionPane.OK_CANCEL_OPTION:オプションタイプ
⑤引数:JOptionPane.QUESTION_MESSAGE:アイコン
戻り値:int ret:ボタンをされた結果を受け取ります。
131retがOKボタンかどうか判別します。
132ラベル5のテキストに"OK"を設定しています。
133retがキャンセルボタンかどうか判別します。
134ラベル5のテキストに"CANCEL"を設定しています。
135~136それ以外なら、ラベル5のテキストに"OHTERS"を設定しています。
行数説明
139アクションイベントがボタン6かどうか判別しています。
141~142JOptionPaneクラス
showMessageDialogメソッド
①引数:this :親ウインドウ
②引数:"メッセージボタンが押されました":メッセージ
③引数:"information":タイトルバー
④引数:JOptionPane.INFORMATION_MESSAGE:アイコン
143ラベル6のテキストに"メッセージボタン押下済"を設定しています。

行数説明
146アクションイベントがボタン7かどうか判別しています。
147~148JColorChooserクラス
showDialogメソッド
①引数:this :親ウインドウ
②引数:"色を選択してください":タイトルバー
③引数:getForegroud():初期色
戻り値:Color newColor:選択した色(RGB)
149ラベル7のテキストに選択した色(RGB)を数値化して設定しています。
150ボタン7の背景色を選択した色に設定します。

これで、準備完了です。実行してみましょう。まず、子画面ボタンを押下します。

親画面の上に、子画面が起動します。

テキストフィールドに入力して、「OK」ボタンを押下します。

子画面で入力した文字が表示します。次に、「ファイル選択」ボタンを押下します。

ファイル選択ダイアログが起動します。

ファイル選択後、「開く」ボタンを押下します。

選択したファイルのパスとファイル名を表示します。「ユーザ入力」ボタンを押下します。

ユーザ入力ダイアログが表示されます。

メッセージを入力して、「OK」ボタンを押下します。

入力したメッセージが表示されます。「ユーザ選択」ボタンを押下します。

ユーザ選択ダイアログが表示します。

選択後、「OK」ボタンを押下します。

選択した文字列を表示します。「ユーザ確認」ボタンを押下します。

確認ダイアログを表示します。「OK」ボタンを押下します。

OKを表示します。「メッセージ」ボタンを押下します。

メッセージダイアログを表示します。「OK」ボタンを押下します。

メッセージボタン押下済を表示します。「色選択」ボタンを押下します。

色選択ダイアログを表示します。

色を選択して、「OK」ボタンを押下します。

選択した色で、ボタンの背景色が変わりました。ボタンのRGBを数字で表示しています。

ここまで表示できれば、成功です。お疲れ様でした!

☆まとめ☆ 今回は、色々なダイアログについて学びました。
よく使われるダイアログについては、APIとして用意されているので、
そのまま呼び出せるのでとても便利でしたね。
ダイアログの種類や使い方を覚えていただけばと思います。

■ソースコードのコピーペスト用に記載します。

GuiVariousDialog.java

package app;

import java.awt.Color;
import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class GuiVariousDialog extends JFrame implements ActionListener {

  //ボタン
  JButton jButton1 = new JButton("子画面");
  JButton jButtonOk = new JButton("OK");
  
  JButton jButton2 = new JButton("ファイル選択");
  JButton jButton3 = new JButton("ユーザ入力");
  JButton jButton4 = new JButton("ユーザ選択");
  JButton jButton5 = new JButton("ユーザ確認");
  JButton jButton6 = new JButton("メッセージ");
  JButton jButton7 = new JButton("色選択");
  
  //ラベル
  JLabel jLabel1 = new JLabel("",JLabel.CENTER);
  JLabel jLabel2 = new JLabel("",JLabel.CENTER);
  JLabel jLabel3 = new JLabel("",JLabel.CENTER);
  JLabel jLabel4 = new JLabel("",JLabel.CENTER);
  JLabel jLabel5 = new JLabel("",JLabel.CENTER);
  JLabel jLabel6 = new JLabel("",JLabel.CENTER);
  JLabel jLabel7 = new JLabel("",JLabel.CENTER);
  
  //ダイアログ
  JDialog jDialog = new JDialog();
  //テキストフィールド
  JTextField jTextField = new JTextField(10);
  
  public static void main(String[] args) {
    // TODO 自動生成されたメソッド・スタブ
    new GuiVariousDialog();
  }
  public GuiVariousDialog() {
    //アクションリスナー登録
    jButton1.addActionListener(this);
    jButton2.addActionListener(this);
    jButton3.addActionListener(this);
    jButton4.addActionListener(this);
    jButton5.addActionListener(this);
    jButton6.addActionListener(this);
    jButton7.addActionListener(this);
    
    //グリッドレイアウトでボタンとラベルの配置
    getContentPane().setLayout(new GridLayout(7,2));
    getContentPane().add(jButton1);
    getContentPane().add(jLabel1);
    getContentPane().add(jButton2);
    getContentPane().add(jLabel2);
    getContentPane().add(jButton3);
    getContentPane().add(jLabel3);
    getContentPane().add(jButton4);
    getContentPane().add(jLabel4);
    getContentPane().add(jButton5);
    getContentPane().add(jLabel5);
    getContentPane().add(jButton6);
    getContentPane().add(jLabel6);
    getContentPane().add(jButton7);
    getContentPane().add(jLabel7);
    
    //フレーム自身設定
    setTitle("色々なダイアログ");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(500,300);
    setVisible(true);
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    // TODO 自動生成されたメソッド・スタブ
    //子画面ボタン押下時
    if (e.getSource()==jButton1) {
      jDialog.getContentPane().setLayout(new FlowLayout());
      //テキストフィールド設定
      jDialog.getContentPane().add(jTextField);
      //OKボタン設定
      jDialog.getContentPane().add(jButtonOk);
      //アクションリスナー登録
      jButtonOk.addActionListener(this);
      jDialog.setTitle("子画面");
      jDialog.setSize(300,200);
      jDialog.setVisible(true);
    }
    //子画面OKボタン押下時
    else if(e.getSource()==jButtonOk) {
      jLabel1.setText(jTextField.getText());
      jDialog.setVisible(false);
    }
    //ファイル選択ボタン押下時
    else if(e.getSource()==jButton2) {
      FileDialog fileDialog = new FileDialog(this);
      fileDialog.setTitle("ファイル選択");
      fileDialog.setSize(300,200);
      fileDialog.setVisible(true);
      jLabel2.setText(fileDialog.getDirectory()+fileDialog.getFile());  
    }
    //ユーザ入力ボタン押下時
    else if(e.getSource()==jButton3) {
      String str=JOptionPane.showInputDialog(this,"メッセージを入れてください");
      jLabel3.setText(str);
    }
    //ユーザ選択ボタン押下時
    else if(e.getSource()==jButton4) {
       Object[] possibleValues = { "日本", "アメリカ", "イギリス" };
       Object selectedValue = JOptionPane.showInputDialog(this,
       "選択してください", "Input",
       JOptionPane.INFORMATION_MESSAGE, null,
       possibleValues, possibleValues[0]);
       jLabel4.setText(String.valueOf(selectedValue));  
    }
    //確認ボタン押下時
    else if(e.getSource()==jButton5) {
      int ret=JOptionPane.showConfirmDialog(this,
          "メッセージ", "タイトル", JOptionPane.OK_CANCEL_OPTION,
          JOptionPane.QUESTION_MESSAGE);
      if(ret==JOptionPane.OK_OPTION) {
        jLabel5.setText("OK");
      }else if(ret==JOptionPane.CANCEL_OPTION){
        jLabel5.setText("CANCEL");        
      }else {
        jLabel5.setText("OTHERS");  
      }
    }
    //メッセージボタン押下時
    else if(e.getSource()==jButton6) {
      JOptionPane.showMessageDialog(this, "メッセージボタンが押されました","information",
          JOptionPane.INFORMATION_MESSAGE);
      jLabel6.setText("メッセージボタン押下済");
    }
    //色選択ボタン押下時
    else if(e.getSource()==jButton7) {
      Color newColor = JColorChooser.showDialog(
          this, "色を選択してください", getForeground());
      jLabel7.setText(String.valueOf(newColor));
      jButton7.setBackground(newColor);
    }
    
  }

}

Follow me!