showXxxDialogの使い方

目次

JOptionPaneのstaticメソッド一覧

Dialogを表示するメソッドのうち、Internalでないものの全てです。

戻値 method ( Component
parentCmp
Object
message
String
title,
int
optionType
int
messageType
Icon
icon
Object[]
selfrom
Object
initVal
)
int showConfirmDialog ( parent, message オプションの選択 YES_NO_CANCEL QUESTION ? )
int showConfirmDialog ( parent, message title optTp QUESTION ? )
int showConfirmDialog ( parent, message, title, optTp, msgTp )
int showConfirmDialog ( parent, message, title, optTp, msgTp, icon )
int showOptionDialog ( parent, message, title, optTp, msgTp, icon, options, initVal )
void showMessageDialog ( parent, message メッセージ DEFAULT INFORMATION i )
void showMessageDialog ( parent, message, title, DEFAULT msgTp )
void showMessageDialog ( parent, message, title, DEFAULT msgTp, icon )
String showInputDialog ( parent, message 入力 OK_CANCEL QUESTION ? )
String showInputDialog ( parent, message, 入力 OK_CANCEL QUESTION ? initVal )
String showInputDialog ( parent, message, title, OK_CANCEL msgTp )
Object showInputDialog ( parent, message, title, OK_CANCEL msgTp, icon, selValues, initVal )
String showInputDialog ( null message 入力 OK_CANCEL QUESTION ? )
String showInputDialog ( null message, 入力 OK_CANCEL QUESTION ? initVal )

intの定数値いろいろ

methodがintを
返す場合の値
optionType
(選択ボタンのセット)
messageType
( ! や ? のアイコンの選択)
JOptionPane.YES_OPTION(0)
JOptionPane.NO_OPTION(1)
JOptionPane.CANCEL_OPTION(2)
JOptionPane.OK_OPTION(0)
JOptionPane.CLOSED_OPTION(-1)
JOptionPane.DEFAULT_OPTION(-1)
JOptionPane.YES_NO_OPTION(0)
JOptionPane.YES_NO_CANCEL_OPTION(1)
JOptionPane.OK_CANCEL_OPTION (2)
JOptionPane.ERROR_MESSAGE(0)
JOptionPane.INFORMATION_MESSAGE(1)
JOptionPane.WARNING_MESSAGE(2)
JOptionPane.QUESTION_MESSAGE(3)
JOptionPane.PLAIN_MESSAGE (-1)

showConfirmDialog(1) parentとmessageだけで

Confirmは確認です。

親コンポーネントはnullでも認められます。

messageはObjectなので表示できるものなら何でもいいのですが、とりあえず文字列で進めます。

CDTest1.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;
//showConfirmDialog のテスト
public class CDTest1 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        int ret = showConfirmDialog(
                    parent,
                    message
                  );
        if (ret==YES_OPTION)    System.out.println("YES_OPTION:"+ret);
        if (ret==NO_OPTION)     System.out.println("NO_OPTION:"+ret);
        if (ret==CANCEL_OPTION) System.out.println("CANCEL_OPTION:"+ret);
        if (ret==OK_OPTION)     System.out.println("OK_OPTION:"+ret);
        if (ret==CLOSED_OPTION) System.out.println("CLOSED_OPTION:"+ret);
    }
}

実行結果

省略されたoptionTypeはYES_NO_CANCEL_OPTION、messageTypeはQUESTION_MESSAGEです。

YES,OKは共に0。intの戻り値はどのOptionTypeでも共通です。

$ java optionpane/CDTest1
YES_OPTION:0
OK_OPTION:0
$ java optionpane/CDTest1
NO_OPTION:1
$ java optionpane/CDTest1
CANCEL_OPTION:2
$ java optionpane/CDTest1
CLOSED_OPTION:-1

CLOSED_OPTIONはダイアログのクローズボタンを押した場合。linux-gnomeではクローズボタンはありませんがコンテキストメニューから[閉じる]を選択できます。

showConfirmDialog(2) titleとoptionType(選択肢)の設定

タイトルバーの文字列と選択肢のボタンを指定します


CDTest2.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;

public class CDTest2 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        int optTp = YES_NO_OPTION; //ここを変化させる
        int ret = showConfirmDialog(
                    parent,
                    message,
                    title,
                    optTp
                  );
        System.out.println("戻り値:"+ret);
        if (optTp==DEFAULT_OPTION)       System.out.println("DEFAULT_OPTION:"+optTp);
        if (optTp==YES_NO_OPTION)        System.out.println("YES_NO_OPTION:"+optTp);
        if (optTp==YES_NO_CANCEL_OPTION) System.out.println("YES_NO_CANCEL_OPTION:"+optTp);
        if (optTp==OK_CANCEL_OPTION)     System.out.println("OK_CANCEL_OPTION:"+optTp);
    }
}

実行結果

int optTp = ...を変えて、4通りやっています。

省略されたmessageTypeはQUESTION_MESSAGEになっているとわかります。

intの戻り値は全部の場合を調べましたが、どのOptionTypeでも共通なのが確認できます。

int optTp = DEFAULT_OPTION;
$ java optionpane/CDTest2
戻り値:0
DEFAULT_OPTION:-1
int optTp = YES_NO_OPTION;
$ java optionpane/CDTest2
戻り値:0
YES_NO_OPTION:0
$ java optionpane/CDTest2
戻り値:1
YES_NO_OPTION:0
int optTp = YES_NO_CANCEL_OPTION;
$ java optionpane/CDTest2
戻り値:0
YES_NO_CANCEL_OPTION:1
$ java optionpane/CDTest2
戻り値:1
YES_NO_CANCEL_OPTION:1
$ java optionpane/CDTest2
戻り値:2
YES_NO_CANCEL_OPTION:1
int optTp = OK_CANCEL_OPTION;
$ java optionpane/CDTest2
戻り値:0
OK_CANCEL_OPTION:2
$ java optionpane/CDTest2
戻り値:2
OK_CANCEL_OPTION:2

showConfirmDialog(3) さらにmessageTypeでアイコンを指定

タイトルバーの文字列と選択肢のボタンに加え、メッセージのタイプを指定します。見え方の違いはアイコンだけです。



上図スクリーンショットでは選択肢のボタンはDEFAULT_OPTIONに固定しています

CDTest3.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;

public class CDTest3 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        int optTp = DEFAULT_OPTION; //固定
        int msgTp = QUESTION_MESSAGE; //PLAIN_MESSAGE;  ここを変化させる
        int ret = showConfirmDialog(
                    parent,
                    message,
                    title,
                    optTp,
                    msgTp
                  );
        System.out.println("戻り値:"+ret);
        if (msgTp==ERROR_MESSAGE)       System.out.println("ERROR_MESSAGE:"+msgTp);
        if (msgTp==INFORMATION_MESSAGE) System.out.println("INFORMATION_MESSAGE:"+msgTp);
        if (msgTp==WARNING_MESSAGE)     System.out.println("WARNING_MESSAGE:"+msgTp);
        if (msgTp==QUESTION_MESSAGE)    System.out.println("QUESTION_MESSAGE:"+msgTp);
        if (msgTp==PLAIN_MESSAGE)       System.out.println("PLAIN_MESSAGE:"+msgTp);
    }
}

実行結果

int optTp = DEFAULT_OPTION; は固定です。

int msgTp = ...を変えて、5通りやっています。

DEFAULT_OPTIONしかないので、intの戻り値はいつも0です。

int msgTp = ERROR_MESSAGE;
$ java optionpane/CDTest3
戻り値:0
ERROR_MESSAGE:0
int msgTp = INFORMATION_MESSAGE;
$ java optionpane/CDTest3
戻り値:0
INFORMATION_MESSAGE:1
int msgTp = WARNING_MESSAGE;
$ java optionpane/CDTest3
戻り値:0
WARNING_MESSAGE:2
int msgTp = QUESTION_MESSAGE;
$ java optionpane/CDTest3
戻り値:0
QUESTION_MESSAGE:3
int msgTp = PLAIN_MESSAGE;
$ java optionpane/CDTest3
戻り値:0
PLAIN_MESSAGE:-1

showConfirmDialog(4) アイコンも変更

タイトルバーの文字列と選択肢のボタン、メッセージのタイプに加えて、アイコンも指定します。メッセージのタイプは無視された形になります。

上図スクリーンショットでは選択肢のボタンはDEFAULT_OPTIONにしていますが、変更はできます。

CDTest4.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;
import javax.swing.ImageIcon;
public class CDTest4 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        int optTp = DEFAULT_OPTION; //固定
        int msgTp = INFORMATION_MESSAGE; //PLAIN_MESSAGE; 無視される
        ImageIcon icon = new ImageIcon("optionpane/ninjin.png");
        int ret = showConfirmDialog(
                    parent,
                    message,
                    title,
                    optTp,
                    msgTp,
                    icon
                  );
        System.out.println("戻り値:"+ret);
        if (msgTp==ERROR_MESSAGE)       System.out.println("ERROR_MESSAGE:"+msgTp);
        if (msgTp==INFORMATION_MESSAGE) System.out.println("INFORMATION_MESSAGE:"+msgTp);
        if (msgTp==WARNING_MESSAGE)     System.out.println("WARNING_MESSAGE:"+msgTp);
        if (msgTp==QUESTION_MESSAGE)    System.out.println("QUESTION_MESSAGE:"+msgTp);
        if (msgTp==PLAIN_MESSAGE)       System.out.println("PLAIN_MESSAGE:"+msgTp);
    }
}

実行結果

int optTp = DEFAULT_OPTION; は固定です。

int msgTp = ...を変えて、2通りやっていますが、iconを指定するとmessageTypeは無視されます。

今回もDEFAULT_OPTIONしかないので、intの戻り値はいつも0です。

$ javac optionpane/CDTest4.java 
$ java optionpane/CDTest4
戻り値:0
QUESTION_MESSAGE:3
$ javac optionpane/CDTest4.java 
$ java optionpane/CDTest4
戻り値:0
INFORMATION_MESSAGE:1

親コンポーネント

親コンポーネントを指定するデモです。

いままで、nullにしていたparentですが、Componentを指定するのが本来です。API仕様には、「直系の既知のサブクラス」として Button, Canvas, Checkbox, Choice, Container, Label, List, Scrollbar, TextComponent が書かれています。

親コンポーネントはダイアログの表示位置の基準となるとともに、ダイアログでユーザーの対話が終了するまで操作をブロックする対象でもあります。このようなダイアログをモーダルといいます。showXxxDialog メソッドで生成されるダイアログはすべてモーダルです。

2つのボタンを置き、クリックしたボタンを親コンポーネントにダイアログを出すプログラムで確認してみます。

CDTest5.java

package optionpane;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import static javax.swing.JOptionPane.*;

public class CDTest5 implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        Component parent = (Component)e.getSource(); //Object->Component
        String message = e.getActionCommand();
        String title   = "タイトルバーの文字";
        int optTp = DEFAULT_OPTION;
        int msgTp = INFORMATION_MESSAGE;
        int ret = showConfirmDialog(
                    parent,
                    message,
                    title,
                    optTp,
                    msgTp,
                    icon
                  );
        System.out.println("戻り値:"+ret);
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
    public static void createAndShowGUI() {
        JLabel label = new JLabel(" 押したボタンがダイアログの親になります ",JLabel.CENTER);
        JButton button1 = new JButton("West");
        JButton button2 = new JButton("East");
        CDTest5 cdtest= new CDTest5();
        button1.addActionListener(cdtest);
        button2.addActionListener(cdtest);
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(label, BorderLayout.CENTER);
        panel.add(button1, BorderLayout.WEST);
        panel.add(button2, BorderLayout.EAST);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}

実行結果

起動直後 クリックした方のボタンが親コンポーネントになります。

Westボタンクリック Westボタンを中心にダイアログが出ます。

Eastボタンクリック Eastボタンを中心にダイアログが出ます。

CDTest5.javaの面白いところ

サンプルプログラムではaddActionListener()の引数がたいていはthisで存在意味が理解しにくいのですが、このプログラムではCDTest5クラスのインスタンスになっています。ActionListenerインターフェースを持ったクラスのインスタンスを引数にするというのがよくわかります。

actionPerformed(ActionEvent e)は引数がActionEventのインスタンスだけですから、フィールドの変数を使うことが多いのですが、今回はそれをせずにgetSource()とgetActionCommand()で済ませています。

messageがJScrollPaneの場合


messageはとりあえず文字列でやってきましたが、Objectになっていますので表示できるものなら何でもいいのです。JTextAreaが入ったJScrollPaneにしてみます。

CDTest6.java

package optionpane;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import static javax.swing.JOptionPane.*;

public class CDTest6 implements ActionListener{
    JTextArea text = new JTextArea(10,20);
    JScrollPane message = new JScrollPane(text);
    int ct = 0;
    int yct = 0;
    int nct = 0;
    public void actionPerformed(ActionEvent e) {
        Component parent = (Component)e.getSource(); //Object->Component
        //JLabel message = label; //e.getActionCommand();
        text.append(++ct+" "+e.getActionCommand()+"   Y:"+ct+" N:"+nct+"\n");
        String title   = "タイトルバーの文字";
        int optTp = YES_NO_OPTION;
        int msgTp = INFORMATION_MESSAGE;
        int ret = showConfirmDialog(
                    parent,
                    message,
                    title,
                    optTp,
                    msgTp
                  );
        if (ret==YES_OPTION) yct++;
        if (ret==NO_OPTION) nct++;
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
    public static void createAndShowGUI() {
        JLabel label = new JLabel(" 押したボタンがダイアログの親になります ",JLabel.CENTER);
        JButton button1 = new JButton("West");
        JButton button2 = new JButton("East");
        CDTest6 cdtest= new CDTest6();
        button1.addActionListener(cdtest);
        button2.addActionListener(cdtest);
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(label, BorderLayout.CENTER);
        panel.add(button1, BorderLayout.WEST);
        panel.add(button2, BorderLayout.EAST);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}

messageがJPanelの場合

JCheckBoxが入ったJPanelにしてみます。ダイアログでの選択の後、オプションボタン以外の値を受け取ることが目的です。

要するに、ダイアログが閉じられても、JCheckBoxのインスタンスは存在するので、そこかに問い合わせるということです。


CDTest7.java

package optionpane;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import static javax.swing.JOptionPane.*;

public class CDTest7 extends JPanel implements ActionListener{
    JTextArea text = new JTextArea(10,20);
    JCheckBox[] cbs = {new JCheckBox("りんご"),new JCheckBox("とまと"),new JCheckBox("なすび")};
    JPanel message = new JPanel();
    public CDTest7(){
        JScrollPane scpane = new JScrollPane(text);
        JLabel label = new JLabel("今回の果実を選択してください",JLabel.CENTER);
        JButton button = new JButton("select");
        button.addActionListener(this);
        setLayout(new BorderLayout());
        add(label,  BorderLayout.NORTH);
        add(scpane, BorderLayout.CENTER);
        add(button, BorderLayout.SOUTH);
        for(int i=0; cbs.length>i; i++){
            message.add(cbs[i]);
        }
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("select")){
            String title   = "果実選択";
            int optTp = OK_CANCEL_OPTION;
            int msgTp = QUESTION_MESSAGE;
            int ret = showConfirmDialog(
                      this, //parent,
                      message,
                      title,
                      optTp,
                      msgTp
                    );
            if (ret==OK_OPTION){
                for(int i=0; cbs.length>i; i++){
                    if(cbs[i].isSelected()){
                        text.append(cbs[i].getText()+" ");
                    }
                }
                text.append("\n");
            }
        }
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
    public static void createAndShowGUI() {
        CDTest7 cdtest= new CDTest7();
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(cdtest);
        frame.pack();
        frame.setVisible(true);
    }
}

起動直後です

Selectボタンで入力中

[OK]するとテキストエリアに書きだされます。

繰り返し入力できます

optionTypeを自分で設定したい-showOptionDialog

optionTypeというのはYES_NO_OPTION、YES_NO_CANCEL_OPTIONの様に応答の選択肢の組み合わせのタイプということです。このoptionの自由な指定に特化したのがshowOptionDialogです。

ODTest1.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;
import javax.swing.ImageIcon;
public class ODTest1 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        int optTp = DEFAULT_OPTION;
        int msgTp = INFORMATION_MESSAGE;
        ImageIcon icon = new ImageIcon("optionpane/ninjin.png");
        String[] options = {"アジサイ","シバザクラ","レンギョウ","テッセン","スミレ"};
        int ret = showOptionDialog(
                    parent,
                    message,
                    title,
                    optTp,
                    msgTp,
                    icon,
                    options,
                    options[0]
                  );
        System.out.println("戻り値:"+ret+"="+options[ret]);
    }
}

ここの例に採用した値でshowOptionDialog()の引数を解説します。

Component parent = null;
親コンポーネントnullが許されます
String message = "メッセージ(ここはObject)";
メッセージとして表示するObject。ここでは簡単に文字列にしました。nullも可
String title = "タイトルバーの文字";
タイトルバーに表示される文字列。nullも可
int optTp = DEFAULT_OPTION;
選択肢のボタンを指定するものだが、独自のオプション(ここではString[] options)があれば無視される。intなのでnullは許されません。
int msgTp = INFORMATION_MESSAGE;
メッセージのタイプを指定します。見え方の違いはアイコンだけです。intなのでnullは許されません。
ImageIcon icon = new ImageIcon("optionpane/ninjin.png");
アイコンを指定します。これがあるとメッセージのタイプは無視される形になりますが、nullにするとメッセージのタイプによりアイコンが決定します。
String[] options = {"アジサイ","シバザクラ","レンギョウ","テッセン","スミレ"};
独自の選択肢のボタンを指定します。このためにshowOptionDialogがあるにも関わらず、nullにできます。その場合はオプションタイプ(nullにできない)のオプションになります。Objectの配列を指定できますが、ここでは文字列にしました。
options[0]
独自の選択肢のボタンの初期値の指定です。普通は指定した配列の要素の1つを指定することになると思いますが、直接の値("レンギョウ"など)でも問題ありません。選択肢にない値でもコンパイルは通ります。そればかりか異なるクラスの値でも通ります。指定がObjectだからでしょう。選択肢に一致するものがあれば初期値として働きますが、なければ働かないだけです。働くというのはEnterキーだけでその項目を選択したことになるということです。

実行結果

戻り値は選択肢の配列のindexになります。

$ java optionpane.ODTest1 
戻り値:2=レンギョウ

画像を選択するshowOptionDialog

独自の選択肢はObjectの配列を指定できるというので、文字列以外を試します。まずは画像。

ナスとアリは背景が透過の画像です。ユリと渦巻は背景が白の画像です。一般のJButtonは背景色をフラットな白にもできますが、showOptionDialogのボタンは難しいと思います。Look&Feelの設定をいじる必要があるようです。

ODTest2.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;
import javax.swing.ImageIcon;
public class ODTest2 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        int optTp = DEFAULT_OPTION;
        int msgTp = INFORMATION_MESSAGE; //PLAIN_MESSAGE;
        ImageIcon icon = new ImageIcon("optionpane/ninjin.png");
        ImageIcon[] options = {
                    new ImageIcon("optionpane/nasu.png"),
                    new ImageIcon("optionpane/hakiri.png"),
                    new ImageIcon("optionpane/yuri.png"),
                    new ImageIcon("optionpane/spl.png")
                   };
        int ret = showOptionDialog(
                    parent,
                    message,
                    title,
                    optTp,
                    msgTp,
                    icon,
                    options,
                    options[0]
                  );
        int ret2 = showConfirmDialog(
                    null,         //parent,
                    options[ret], //message
                    "選択した画像", //title
                    DEFAULT_OPTION,
                    PLAIN_MESSAGE
                  );
    }
}

実行結果


選択した結果をshowConfirmDialogで表示しています。

Componentを選択するshowOptionDialog

Java SE7のAPI仕様に、「options - ユーザーが選択可能な項目を示すオブジェクトの配列。オブジェクトがコンポーネントの場合は適切にレンダリングされる。」とあるので、Object[]がComponent[]でもいいのかと試してみました。これはダメです。

JButton, JLabel, JCheckBox, JTextField を要素にしたものです。「適切にレンダリングされ」ましたが、選択することができません。ボタンには画像と文字しか貼ることができないと言う事なのかも知れません。

ODTest3.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;
import javax.swing.*;
public class ODTest3 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        int optTp = DEFAULT_OPTION;
        int msgTp = INFORMATION_MESSAGE;
        ImageIcon icon = new ImageIcon("optionpane/kani.png");
        Component[] options = {
                    new JButton("button"),
                    new JLabel("label"),
                    new JCheckBox("CheckBox"),
                    new JTextField("TextField")
                   };
        int ret = showOptionDialog(
                    parent,
                    message,
                    title,
                    optTp,
                    msgTp,
                    icon,
                    options,
                    options[1]
                  );
        if(ret==CLOSED_OPTION)ret=3;
        int ret2 = showConfirmDialog(
                    null,         //parent,
                    options[ret], //message
                    "選択した部品", //title
                    DEFAULT_OPTION,
                    PLAIN_MESSAGE
                  );
    }
}

実行結果


ボタンは押せますし、チェックも入ります、文字入力もできますが選択できません。

閉じるボタン[✕]を押す(Linux-Gnomeではコンテキストメニューから閉じるを選択する)と戻り値がCLOSED_OPTION(-1)で閉じることができますので、この場合にJTextFieldを選択したように振る舞うようにしました。

showMessageDialog(1) parentとmessageだけで

一番の特徴は戻り値がないこと

親コンポーネントはnullでも認められます。

messageはObjectなので表示できるものなら何でもいいのですが、とりあえず文字列で進めます。

MDTest1.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;

public class MDTest1 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        showMessageDialog(
                    parent,
                    message
                  );
    }
}

showMessageDialog(2) titleとmessageType(アイコン)の指定

どうせ戻り値がありませんから、optionTypeは意味がありません。messageType(アイコン)の指定するタイプが次に来ます

スクリーンショットはCDTest3.javaでoptionTypeをDEFAULT_OPTIONにしたものと同等です。

int msgTp = ERROR_MESSAGE; int msgTp = INFORMATION_MESSAGE;
int msgTp = WARNING_MESSAGE; int msgTp = QUESTION_MESSAGE;
int msgTp = PLAIN_MESSAGE;

MDTest2.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;

public class MDTest2 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        int msgTp = PLAIN_MESSAGE;  //ここを変化させる
        showMessageDialog(
                    parent,
                    message,
                    title,
                    msgTp
                  );
    }
}

showMessageDialog(3) アイコンも変更

アイコンも指定します。メッセージのタイプは無視された形になります。

スクリーンショットはCDTest4.javaでoptionTypeをDEFAULT_OPTIONにしたものと同等です。

MDTest3.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;
import javax.swing.ImageIcon;
public class MDTest3 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        int msgTp = INFORMATION_MESSAGE; //PLAIN_MESSAGE; 無視される
        ImageIcon icon = new ImageIcon("optionpane/ninjin.png");
        showMessageDialog(
                    parent,
                    message,
                    title,
                    msgTp,
                    icon
                  );
    }
}

showInputDialog(1) parentとmessageだけで

入力枠があり戻り値は文字列です。

親コンポーネントはnullでも認められます。親コンポーネントを指定しないタイプもあります。 "null,"の部分を書かなければそのタイプです。

messageはObjectなので表示できるものなら何でもいいのですが、とりあえず文字列で進めます。

titleは"入力"となります。

optionType(選択肢)はOK_CANCEL_OPTION、messageTypeはQUESTION_MESSAGEになります。

IDTest1.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;
public class IDTest1 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String ret = showInputDialog(
                    parent,
                    message
                  );
        System.out.println("return value:"+ret);
    }
}

実行結果

[はい]を選ぶと、入力したものが文字列として戻り値になります。入力がないと""です。

[いいえ]を選ぶと、戻り値はnullになります。

showInputDialog(2) 入力に初期値

showInputDialog(1)と同様です。入力に初期値が入っているところだけ異なります。

親コンポーネントはnullでも認められます。親コンポーネントを指定しないタイプもあります。 "null,"の部分を書かなければそのタイプです。

IDTest2.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;
public class IDTest2 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String initvalue = "初期値を書いておきます";
        String ret = showInputDialog(
                    parent,
                    message,
                    initvalue
                  );
        System.out.println("return value:"+ret);
    }
}

実行結果

[はい]を選ぶと、入力したものが文字列として戻り値になります。入力がないと""です。

[いいえ]を選ぶと、戻り値はnullになります。

showInputDialog(3) messageTypeでアイコンを指定

タイトルバーの文字列とメッセージのタイプを指定します。見え方の違いはアイコンだけです。

int msgTp = ERROR_MESSAGE; int msgTp = INFORMATION_MESSAGE;
int msgTp = WARNING_MESSAGE; int msgTp = QUESTION_MESSAGE;
int msgTp = PLAIN_MESSAGE;

IDTest3.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;

public class IDTest3 {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        int msgTp = ERROR_MESSAGE;  //ここを変化させる
        String ret = showInputDialog(
                    parent,
                    message,
                    title,
                    msgTp
                  );
        System.out.println("return value:"+ret);
    }
}

実行結果

[はい]を選ぶと、入力したものが文字列として戻り値になります。入力がないと""です。

[いいえ]を選ぶと、戻り値はnullになります。

showInputDialog(4) 選択肢から選択

選択肢から選択します。

選択肢以外の値を入力できず、選択肢がObject[]で与えられるので、OptionDialogに似ています。戻り値は選択されたObjectの値となります。OptionDialogは全てintでしたから、InputDialogに分類したのでしょう。

IDTest4a.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;
import javax.swing.ImageIcon;
public class IDTest4a {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        //int optTp = DEFAULT_OPTION;
        int msgTp = INFORMATION_MESSAGE; //PLAIN_MESSAGE;
        ImageIcon icon = new ImageIcon("optionpane/ninjin.png");
        String[] selValues = {"アジサイ","シバザクラ","レンギョウ","テッセン","スミレ"};
        Object retobj = showInputDialog(
                    parent,
                    message,
                    title,
                    //optTp,
                    msgTp,
                    icon,
                    selValues,
                    selValues[0]
                  );
        System.out.println("return value:"+retobj);
    }
}

実行結果

初期値が表示されます

入力欄をクリックすると選択肢リストが出てきます。

選択後に[OK]を選ぶと、選択したものがObjectとして戻り値になります。[OK]を選ぶ限り、入力がないことはありえません。

System.out.println()では、toString()を使って表示しますから、Objectのままでも文字列になって「レンギョウ」などと端末に表示されます(省略)。

[取消]を選ぶか、閉じるボタン[✕]で、戻り値はnullになります。

画像を選択する showInputDialog(4)

Objectの配列を指定できるというので、文字列以外を試します。まずは画像。

showOptionDialogの画像と同様、選択した結果をshowConfirmDialogで表示しています。

IDTest4b.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;
import javax.swing.ImageIcon;
public class IDTest4b {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        int optTp = DEFAULT_OPTION;
        int msgTp = INFORMATION_MESSAGE; //PLAIN_MESSAGE;
        ImageIcon icon = new ImageIcon("optionpane/ninjin.png");
        ImageIcon[] selValues = {
                    new ImageIcon("optionpane/nasu.png"),
                    new ImageIcon("optionpane/hakiri.png"),
                    new ImageIcon("optionpane/yuri.png"),
                    new ImageIcon("optionpane/spl.png")
                   };
        Object retobj = showInputDialog(
                    parent,
                    message,
                    title,
                    //optTp,
                    msgTp,
                    icon,
                    selValues,
                    selValues[0]
                  );
        int ret = showConfirmDialog(
                    null,         //parent,
                    retobj,       //message
                    "選択した画像", //title
                    DEFAULT_OPTION,
                    PLAIN_MESSAGE
                  );
    }
}

実行結果

初期値が表示されます

入力欄をクリックすると選択肢リストが出てきます。

選択後に[OK]を選ぶと、選択したものがObjectとして戻り値になります。これをshowConfirmDialogで表示します。

[取消]を選ぶか、閉じるボタン[✕]で、戻り値はnullになります。その場合は空のshowConfirmDialogになります(省略)。

Componentを選択する showInputDialog(4)

Componentを選択するshowOptionDialogと同趣向です。今回は表示は実用になりませんが、選択はでき、showConfirmDialogでの表示もできます。

IDTest4c.java

package optionpane;
import java.awt.Component;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;
import javax.swing.*;
public class IDTest4c {
    public static void main(String[] args) {
        Component parent = null;
        String message = "メッセージ(ここはObject)";
        String title   = "タイトルバーの文字";
        int optTp = DEFAULT_OPTION;
        int msgTp = INFORMATION_MESSAGE; //PLAIN_MESSAGE;
        ImageIcon icon = new ImageIcon("optionpane/kani.png");
        Component[] selValues = {
                    new JButton("button"),
                    new JLabel("label"),
                    new JCheckBox("CheckBox"),
                    new JTextField("TextField")
                   };
        Object retobj = showInputDialog(
                    parent,
                    message,
                    title,
                    //optTp,
                    msgTp,
                    icon,
                    selValues,
                    selValues[3]
                  );
        int ret = showConfirmDialog(
                    null,         //parent,
                    retobj, //message
                    "選択した部品", //title
                    DEFAULT_OPTION,
                    PLAIN_MESSAGE
                  );
    }
}

実行結果

ComponentのtoString()に従って表示されます。初期値の指定によりTextFieldが見えます


選択中の画像は略。これはbuttonを選択した後のものです。


[OK]でボタンが表示されます。