アプリケーションでダイアログを実装する最も一般的な(そして簡単な)方法は

JOptionPane`クラスです。この記事では、ユーザーが `JOptionPane`で作成したボタンをクリックしたときにダイアログウィンドウを閉じる

JOptionPane`のデフォルトの動作を “上書き”する方法について説明します。

私たちが例に移る前に知っておくべきことは、アプリケーションで

JOptionPane`を使用すると、本当に背後で実行されるのはモーダル

JDialog`です。

JOptionPane`は自動的に

JDialog`を作成し、それ自身を `content pane`に追加するコンテナです。

1.基本的な例

この例では、ダイアログウィンドウが自動的に閉じないようにし、代わりに `PropertyChange`リスナを実装することで独自に処理します。以下の例は、ユーザーの操作や入力チェックの処理がないため、このメカニックをコードに実装する絶対的な基礎です。

KeepDialogUp.java

package com.techfou.stayup;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

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

public class KeepDialogUp {

    public static void main(String[]args) {
        JFrame frame = new JFrame();
        ImageIcon icon = new ImageIcon("src/images/turtle64.png");

        Object[]options = {"I DO LOVE TURTLES"};
        JOptionPane jop = new JOptionPane("Admit your love for turtles\nor you shall not pass!!"
                , JOptionPane.ERROR__MESSAGE, 0, icon, options, options[0]);

        JDialog dialog = new JDialog(frame, "You LOVE turtles", true);
        dialog.setDefaultCloseOperation(JDialog.DO__NOTHING__ON__CLOSE);
        dialog.setContentPane(jop);

        jop.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (JOptionPane.VALUE__PROPERTY.equals(evt.getPropertyName())) {
                    dialog.dispose();
                    JOptionPane.showMessageDialog(null, "Good for you >:P");
                    System.exit(0);
                }

            }
        });
        dialog.pack();
        dialog.setLocationRelativeTo(frame);
        dialog.setVisible(true);
    }
}

出力:


swing-keep-dialog-up-1

ユーザーがウィンドウを閉じようとすると、何も起こりません。ユーザーが「I DO LOVE TURTLES」ボタンをクリックすると、プログラムは次のダイアログを表示して終了します。


swing-keep-dialog-up-2

2.リスナーの例

前の例を盛り上げましょう。ダイアログを閉じようとするユーザの操作を処理する

windowListener`を追加し、

propertyChangeListener`でユーザの入力をチェックします。

KeepDialogUpExtended.java

package com.techfou.stayup;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

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

public class KeepDialogUpExtended {

    public static void main(String[]args) {
        JFrame frame = new JFrame();
        ImageIcon icon = new ImageIcon("src/images/turtle64.png");

        Object[]options = {"I DO LOVE TURTLES"};
        JOptionPane jop = new JOptionPane("Admit your love for turtles\nor you shall not pass!!",
                JOptionPane.ERROR__MESSAGE, 0, icon, options, options[0]);

        JDialog dialog = new JDialog(frame, "You LOVE turtles", true);
        dialog.setDefaultCloseOperation(JDialog.DO__NOTHING__ON__CLOSE);
        dialog.setContentPane(jop);

        dialog.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                JOptionPane.showMessageDialog(frame, "YOU SHALL NOT PASS", "!!",
                        JOptionPane.ERROR__MESSAGE);
            }
        });

        jop.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (JOptionPane.VALUE__PROPERTY.equals(evt.getPropertyName())) {
                    if (jop.getValue().equals(options[0])) {
                        dialog.dispose();
                        JOptionPane.showMessageDialog(null, "Good for you >:P");
                        System.exit(0);
                    } else {
                        JOptionPane.showMessageDialog(frame, "There is no\n>> ESC <<",
                                "You little shenanigan...", JOptionPane.ERROR__MESSAGE);
                    }
                }

            }
        });
        dialog.pack();
        dialog.setLocationRelativeTo(frame);
        dialog.setVisible(true);
    }

}

出力:


swing-keep-dialog-up-1

ユーザーがウィンドウを閉じようとすると、次のようになります。


swing-keep-dialog-up-3

ユーザがEscボタンを押した場合:


swing-keep-dialog-up-4

これはかなりこの機械を要約しています。 `JOptionPane`の戻り値をチェックする従来の方法では、ユーザ入力を扱う方がリソースがより効率的であると主張する人もいます。多分、そうでないかもしれない。コードの残りの部分に応じて、このメカニックは欠けているかもしれません。あなたが正しい選択をする可能性が高いことが分かっているほど、それは確実です。

参考文献

自動ダイアログクローズ]。

https://docs.oracle.com/javase/8/docs/api/java/awt/Dialog.html

[Class

JOptionPane – Java 8 API]


dialog


JOptionPane

リンク://タグ/スイング/[スイング]