SwingのJOptionPane

2021-07-25

こんにちは。

今回はSwingのJOptionPaneを使ってみました。JOptionPaneはダイアログ表示で使われる場合が多いと思います。JFrameにJButtonを設置し、JOptionPaneを表示するサンプルを色々試しました。

以下のプログラムを雛形として使います。

ソース
import javax.swing.JFrame;

public class Test extends JFrame {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(150, 100);

        init();

        setVisible(true);
    }

    private void init() {
        // 設置処理
    }

}

ボタンを表示するダイアログ

JOptionPane#createDialog()

JOptionPaneはユーザーの入力を求めたり、情報を表示するためのクラスです。基本的にダイアログ表示で使われると思います。

次のサンプルはコンストラクタJOptionPane()を使った例です。

ソース
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Test2 extends JFrame {

    public static void main(String[] args) {
        new Test2();
    }

    public Test2() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(150, 100);

        init();

        setVisible(true);
    }

    private void init() {
        setLayout(new FlowLayout());

        JOptionPane optionPane = new JOptionPane();
        JDialog dialog = optionPane.createDialog(null, "My Test Dialog Title");

        JButton button = new JButton("Open Dialog");
        add(button);
        button.addActionListener(event -> {
            dialog.setVisible(true);
        });
    }

}

上記サンプルでは、「Open Dialog」ボタンを押下するとダイアログが表示されるという動作をします。

最初にJOptionPane#createDialogを使ってます。このメソッドはJDialogオブジェクトを返却します。第一引数で親フレームを指定し、第二引数でタイトルバーに表示するテキストを指定します。次に、JButtonオブジェクトを生成し、押下時にダイアログを表示するようにしています。

JOptionPane0001-01
JOptionPane0001-02

タイトルバーに「My Test Dialog Title」という文字列が表示されています。表示されるメッセージ「JOptionPane message」はコンストラクタJOptionPane()が初期設定で決めているものです。

コンストラクタJOptionPane(Object message)

引数なしのコンストラクタでは表示されるメッセージが決まってました。このメッセージを変更するにはコンストラクタJOptionPane(Object message)を使います。例えば以下のように使います。

ソース
JOptionPane optionPane = new JOptionPane("My Test Message");
JOptionPane0002-01

引数がObjectなのでJPanelを指定することもできます。例えば以下のように使うこともできます。

ソース
JPanel panel = new JPanel();
panel.add(new JLabel("My Panel Test Label"));
panel.add(new JTextField(20));

JOptionPane optionPane = new JOptionPane(panel);
JOptionPane0002-02

上記では最初に、JPanelオブジェクトを生成しています。JLabelオブジェクトとJTextFieldオブジェクトを生成し、JPanelオブジェクトに追加しています。

コンストラクタJOptionPane()の引数にJPanelオブジェクトを指定することで、オプションのウィンドウにJPanelオブジェクトを表示することができます。

JOptionPane#setMessage()

コンストラクタでメッセージを指定しなくても、後で変更できます。void setMessage(Object newMessage)メソッドが用意されてます。例えば、以下のように使います。

ソース
JOptionPane optionPane = new JOptionPane();
optionPane.setMessage("My Test Message 2");

メッセージが「My Test Message 2」という文字列に設定されます。

JOptionPane#setMessageType()

setMessageType()メソッドではメッセージのスタイルを設定できます。引数はint型で、以下のstaticフィールドを指定します。

フィールド 内容
ERROR_MESSAGE エラー・メッセージ
INFORMATION_MESSAGE 情報メッセージ
WARNING_MESSAGE 警告メッセージ
QUESTION_MESSAGE 質問
PLAIN_MESSAGE アイコンを使用しない

以下のように使います。

ソース
JOptionPane optionPane = new JOptionPane();
optionPane.setMessage("My Test Message");
optionPane.setMessageType(JOptionPane.PLAIN_MESSAGE);

以下のキャプチャはsetMessageType()メソッドの引数に、上記のリストの値を指定した結果です。

ERROR_MESSAGE
JOptionPane0003-01
INFORMATION_MESSAGE
JOptionPane0003-02
WARNING_MESSAGE
JOptionPane0003-03
QUESTION_MESSAGE
JOptionPane0003-04
PLAIN_MESSAGE
JOptionPane0003-05

JOptionPane#setOptionType()

setOptionType()メソッドではオプションを設定できます。表示するボタンが変わるようです。引数はint型で、以下のstaticフィールドを指定します。

フィールド 内容
DEFAULT_OPTION 「OK」
YES_NO_OPTION 「はい」、「いいえ」
YES_NO_CANCEL_OPTION 「はい」、「いいえ」、「取消」
OK_CANCEL_OPTION 「OK」、「取消」

以下のように使います。

ソース
JOptionPane optionPane = new JOptionPane();
optionPane.setMessage("My Test Message");
optionPane.setOptionType(JOptionPane.DEFAULT_OPTION);

以下のキャプチャは、setOptionType()メソッドの引数に上記のリストの値を指定した結果です。

DEFAULT_OPTION
JOptionPane0004-01
YES_NO_OPTION
JOptionPane0004-02
YES_NO_CANCEL_OPTION
JOptionPane0004-03
OK_CANCEL_OPTION
JOptionPane0004-04

押下されたボタン

どのボタンが押下されたのかはObject getValue()メソッドで取得できます。押下されたボタンに応じて、以下のstatic フィールドの値が返却されるようです。

  • YES_OPTION
  • NO_OPTION
  • CANCEL_OPTION
  • OK_OPTION
  • CLOSED_OPTION

例えば、以下のように使います。

ソース
private void init() {
    setLayout(new FlowLayout());

    JOptionPane optionPane = new JOptionPane();
    optionPane.setMessage("My Test Message");
    optionPane.setOptionType(JOptionPane.OK_CANCEL_OPTION);

    JDialog dialog = optionPane.createDialog(null, "My Test Dialog Title");

    JButton button = new JButton("Open Dialog");
    add(button);
    button.addActionListener(event -> {
        dialog.setVisible(true);
        if (optionPane.getValue().equals(JOptionPane.YES_OPTION)) {
            System.out.println("Yes.");
        } else if (optionPane.getValue().equals(JOptionPane.CANCEL_OPTION)) {
            System.out.println("Cancel.");
        }
    });
}

「OK」ボタンを押下すると「Yes.」と出力され、「取消」ボタンを押下すると「Cancel.」が出力されます。

showXxxDialogメソッド

標準的なダイアログを出力するためのstaticメソッドが用意されています。異なる引数の同名のメソッドの区別を省略した場合、以下の4つがあります。

  • showConfirmDialog
  • showInputDialog
  • showMessageDialog
  • showOptionDialog

このうちshowOptionDialogは最初の3つを合わせたものです。今回は、最初の3つを使ってみます。

showConfirmDialog

いくつかのメソッドがオーバーロードされています。今回はshowConfirmDialog(Component parentComponent, Object message)を使ってみました。

ソース
private void init() {
    setLayout(new FlowLayout());

    JButton button = new JButton("Open Dialog");
    add(button);
    button.addActionListener(event -> {
        int result = JOptionPane.showConfirmDialog(null, "My Test Dialog Title");
        if (result == JOptionPane.YES_OPTION) {
            System.out.println("Yes.");
        } else if (result == JOptionPane.NO_OPTION) {
            System.out.println("No.");
        } else if (result == JOptionPane.CANCEL_OPTION) {
            System.out.println("Cancel.");
        } else if (result == JOptionPane.CLOSED_OPTION ) {
            System.out.println("Closed.");
        }
    });
}
JOptionPane0005-01

JOptionPane#showConfirmDialogの返却値がint型であり、上記のように押下されたボタンが判別できます。

showInputDialog

いくつかのメソッドがオーバーロードされていますが、今回はshowInputDialog(Component parentComponent, Object message)を使ってみました。

ソース
private void init() {
    setLayout(new FlowLayout());

    JButton button = new JButton("Open Dialog");
    add(button);
    button.addActionListener(event -> {
        String result = JOptionPane.showInputDialog(null, "My Test Message");
        System.out.println(result);
    });
}
JOptionPane0005-02

JOptionPane#showInputDialog()メソッドはString型でユーザーの入力値を返却します。「OK」ボタン押下時は空文字が返却され、「取消」ボタン押下時はnullが返却されます。

showMessageDialog

いくつかのメソッドがオーバーロードされていますが、ここではshowMessageDialog(Component parentComponent, Object message)を使いました。

ソース
private void init() {
    setLayout(new FlowLayout());

    JButton button = new JButton("Open Dialog");
    add(button);
    button.addActionListener(event -> {
        JOptionPane.showMessageDialog(null, "My Test Message");
    });
}
JOptionPane0005-03

JOptionPane#showMessageDialog()の戻り値の定義はvoidなので値を受け取るということはしません。

以上、参考になれば幸いです。

同じカテゴリーの前後の記事