Skip to content
Code Blue プログラミング学習ノート
Java/Swing

簡単なダイアログ(JOptionPane)の活用

Java Swingで簡単なダイアログを表示するには、JOptionPaneクラスが便利です。確認メッセージ、入力フォーム、警告表示など、様々な種類のダイアログを数行のコードで実装できます。

JOptionPaneの基本ダイアログタイプ

JOptionPaneクラスとは、JavaのSwingに含まれるクラスで、メッセージの表示やユーザーからの入力、選択肢の提示などを行うためのダイアログ画面を簡単に作成するために使用されるクラスです。複雑なGUIを作成しなくても、ユーザーとの基本的な対話処理を実現できます。

joptionpane-dialogtype

1. メッセージダイアログ(情報表示)

このコードは、JOptionPaneクラスを使って3種類のメッセージダイアログを表示するプログラムです。

SwingUtilities.invokeLater()でSwingの処理を安全に実行し、showMessageDialog()を使用して、成功メッセージ、警告メッセージ、エラーメッセージをそれぞれ表示しています。メッセージの内容やタイトル、表示するアイコンの種類を指定することで、ユーザーに処理結果や注意事項を分かりやすく伝えています。

import javax.swing.*;

public class MessageDialogExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            // 基本メッセージダイアログ
            JOptionPane.showMessageDialog(
                null, // 親コンポーネント(nullで画面中央)
                "処理が正常に完了しました", // メッセージ
                "成功", // タイトル
                JOptionPane.INFORMATION_MESSAGE // メッセージタイプ
            );

            // 警告メッセージ
            JOptionPane.showMessageDialog(
                null,
                "ディスクの空き容量が少なくなっています",
                "警告",
                JOptionPane.WARNING_MESSAGE
            );

            // エラーメッセージ
            JOptionPane.showMessageDialog(
                null,
                "ファイルが見つかりません",
                "エラー",
                JOptionPane.ERROR_MESSAGE
            );
        });
    }
}

2. 確認ダイアログ(Yes/No選択)

このコードは、JOptionPaneクラスを使って確認ダイアログを表示し、ユーザーの選択によって処理を分岐するプログラムです。

showConfirmDialog()で「削除しますか?」という確認画面を表示し、「はい」または「いいえ」の選択結果を取得します。ユーザーが「はい」を選んだ場合は削除を実行する処理を行い、「いいえ」を選んだ場合はキャンセルしたことを表示します。

import javax.swing.*;

public class ConfirmDialogExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            int response = JOptionPane.showConfirmDialog(
                null,
                "本当に削除しますか?",
                "確認",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.QUESTION_MESSAGE
            );

            if (response == JOptionPane.YES_OPTION) {
                System.out.println("削除が選択されました");
            } else {
                System.out.println("削除がキャンセルされました");
            }
        });
    }
}

3. 入力ダイアログ(テキスト入力)

このコードは、JOptionPaneクラスを使ってユーザーから文字入力を受け取り、その内容に応じてメッセージを表示するプログラムです。showInputDialog()で名前の入力画面を表示し、入力された名前がある場合は挨拶メッセージを表示します。名前が入力されていない場合は、エラーメッセージを表示して入力を促します。

import javax.swing.*;

public class InputDialogExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            // テキスト入力ダイアログ
            String name = JOptionPane.showInputDialog(
                null,
                "あなたの名前を入力してください:",
                "ユーザー登録",
                JOptionPane.PLAIN_MESSAGE
            );

            if (name != null && !name.isEmpty()) {
                JOptionPane.showMessageDialog(
                    null,
                    "こんにちは、" + name + "さん!",
                    "挨拶",
                    JOptionPane.INFORMATION_MESSAGE
                );
            } else {
                JOptionPane.showMessageDialog(
                    null,
                    "名前が入力されませんでした",
                    "エラー",
                    JOptionPane.ERROR_MESSAGE
                );
            }
        });
    }
}

カスタマイズ可能なダイアログ

JOptionPaneでは、より複雑なダイアログも作成できます。

カスタムコンポーネントを含むダイアログ

このコードは、JOptionPaneとSwingの部品を組み合わせて、ユーザー名とパスワードを入力するカスタムダイアログを作成するプログラムです。JPanelに入力欄を配置し、showConfirmDialog()で確認画面として表示します。ユーザーが「OK」を選択すると入力内容を取得し、ユーザー名とパスワードの文字数をメッセージとして表示します。

import javax.swing.*;
import java.awt.*;

public class CustomDialogExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            // カスタムパネルの作成
            JPanel panel = new JPanel(new GridLayout(2, 2, 5, 5));

            JTextField usernameField = new JTextField(15);
            JPasswordField passwordField = new JPasswordField(15);

            panel.add(new JLabel("ユーザー名:"));
            panel.add(usernameField);
            panel.add(new JLabel("パスワード:"));
            panel.add(passwordField);

            int result = JOptionPane.showConfirmDialog(
                null,
                panel,
                "ログイン情報を入力",
                JOptionPane.OK_CANCEL_OPTION,
                JOptionPane.PLAIN_MESSAGE
            );

            if (result == JOptionPane.OK_OPTION) {
                String username = usernameField.getText();
                char[] password = passwordField.getPassword();

                JOptionPane.showMessageDialog(
                    null,
                    "ユーザー名: " + username + "\nパスワード長: " + password.length,
                    "入力情報",
                    JOptionPane.INFORMATION_MESSAGE
                );
            }
        });
    }
}

JOptionPaneのオプション設定

アイコンとボタンのカスタマイズ

このコードは、JOptionPaneのshowOptionDialog()を使って、独自の選択肢を持つダイアログを表示するプログラムです。保存・破棄・キャンセルの3つのボタンを表示し、ユーザーが選択した内容に応じて処理を分岐します。また、カスタムアイコンを設定することで、標準とは異なる見た目のダイアログを作成できます。

import javax.swing.*;
import java.awt.*;

public class CustomOptionDialog {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            // カスタムアイコン
            ImageIcon icon = new ImageIcon("path/to/icon.png");

            // カスタムボタンオプション
            Object[] options = {"保存", "破棄", "キャンセル"};

            int choice = JOptionPane.showOptionDialog(
                null,
                "ドキュメントに変更があります。どうしますか?",
                "ドキュメントの保存",
                JOptionPane.DEFAULT_OPTION,
                JOptionPane.WARNING_MESSAGE,
                icon,
                options,
                options[0] // デフォルト選択
            );

            switch(choice) {
                case 0 -> System.out.println("保存が選択されました");
                case 1 -> System.out.println("破棄が選択されました");
                case 2 -> System.out.println("キャンセルが選択されました");
                default -> System.out.println("ダイアログが閉じられました");
            }
        });
    }
}

実践的な使用例 – ファイル保存確認

このコードは、JOptionPaneを利用した簡易テキストエディタのようなGUIアプリケーションを作成するプログラムです。テキスト入力欄と保存ボタンを配置し、ウィンドウを閉じる際には確認ダイアログを表示します。

また、保存ボタンを押すと保存方法を選択するダイアログやファイル名入力ダイアログを表示し、ユーザーの選択に応じて処理を実行します。JOptionPaneを使うことで、確認・選択・入力などのユーザー操作を簡単に実現しています。

import javax.swing.*;
import java.awt.event.*;

public class FileSaveExample extends JFrame {
    private JTextArea textArea;

    public FileSaveExample() {
        setTitle("簡易テキストエディタ");
        setSize(500, 400);
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); // 閉じる操作をカスタマイズ

        // ウィンドウ閉じる時の確認ダイアログ
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                confirmExit();
            }
        });

        textArea = new JTextArea();
        add(new JScrollPane(textArea));

        JButton saveButton = new JButton("保存");
        saveButton.addActionListener(e -> showSaveDialog());

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(saveButton);
        add(buttonPanel, BorderLayout.SOUTH);
    }

    private void confirmExit() {
        int result = JOptionPane.showConfirmDialog(
            this,
            "変更が保存されていません。終了しますか?",
            "確認",
            JOptionPane.YES_NO_CANCEL_OPTION,
            JOptionPane.WARNING_MESSAGE
        );

        if (result == JOptionPane.YES_OPTION) {
            System.exit(0);
        } else if (result == JOptionPane.NO_OPTION) {
            dispose();
        }
        // CANCELの場合は何もしない
    }

    private void showSaveDialog() {
        String[] options = {"上書き保存", "別名で保存", "キャンセル"};

        int choice = JOptionPane.showOptionDialog(
            this,
            "保存方法を選択してください",
            "保存オプション",
            JOptionPane.DEFAULT_OPTION,
            JOptionPane.QUESTION_MESSAGE,
            null,
            options,
            options[0]
        );

        switch(choice) {
            case 0 -> JOptionPane.showMessageDialog(this, "上書き保存しました");
            case 1 -> {
                String fileName = JOptionPane.showInputDialog(
                    this,
                    "ファイル名を入力:",
                    "別名で保存",
                    JOptionPane.PLAIN_MESSAGE
                );
                if (fileName != null) {
                    JOptionPane.showMessageDialog(this, 
                        fileName + " として保存しました");
                }
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new FileSaveExample().setVisible(true);
        });
    }
}

まとめ

JOptionPaneを使用する際は、親コンポーネントにnullではなくメインウィンドウを指定することで、ダイアログを適切な位置に表示できます。

また、入力ダイアログを利用する場合は、ユーザーが入力をキャンセルした場合に備えて必ずnullチェックを行うことが重要です。さらに、状況に応じてINFORMATION_MESSAGE、WARNING_MESSAGE、ERROR_MESSAGEなどのメッセージタイプを適切に使い分けることで、ユーザーに分かりやすく情報を伝えられます。

ボタンの文字列はリソースバンドルで管理すると、多言語対応が容易になります。なお、JOptionPaneはモーダルダイアログであるため、表示中は他のウィンドウを操作できないという特徴があります。

// 国際化対応の例
String title = ResourceBundle.getBundle("Messages").getString("dialog.title");
String message = ResourceBundle.getBundle("Messages").getString("dialog.message");
JOptionPane.showMessageDialog(frame, message, title, JOptionPane.INFORMATION_MESSAGE);

JOptionPaneを活用することで、簡単にプロフェッショナルなダイアログを表示できます。複雑な要件にはJDialogクラスを使用したカスタムダイアログの作成も検討しましょう。