Java Swing - Garder la fenêtre de dialogue ouverte

Java Swing - Garder la fenêtre de dialogue ouverte

Le moyen le plus courant pour(and simple) d'implémenter un dialogue dans notre application est la classeJOptionPane. Dans cet article, nous verrons comment «écraser» le comportement par défaut deJOptionPane qui ferme la fenêtre de dialogue lorsque l'utilisateur clique sur un bouton créé parJOptionPane.

Ce que nous devons savoir avant de passer aux exemples, c'est que lorsque nous utilisons unJOptionPane dans notre application, ce qui fonctionne vraiment dans les coulisses est unJDialog modal. JOptionPane est un conteneur qui crée automatiquement unJDialog et s’ajoute à soncontent pane.

1. Exemple de base

Dans cet exemple, nous empêchons la fenêtre de dialogue de se fermer automatiquement et nous la gérons nous-mêmes en implémentant un écouteurPropertyChange. L'exemple ci-dessous est la base absolue de l'implémentation de ce mécanisme dans votre code car il n'y a pas de gestion de l'interaction de l'utilisateur ou de la vérification des entrées.

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);
    }
}

Sortie:

swing-keep-dialog-up-1

Si l'utilisateur tente de fermer la fenêtre, rien ne se passe. Si l'utilisateur clique sur le bouton «I DO LOVE TURTLES», le programme affiche la boîte de dialogue suivante puis quitte.

swing-keep-dialog-up-2

2. Exemple avec des auditeurs

Pimentons maintenant l'exemple précédent. Nous ajouterons unwindowListener pour gérer la tentative de l'utilisateur de fermer la boîte de dialogue et nous vérifierons l'entrée de l'utilisateur danspropertyChangeListener.

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);
    }

}

Sortie:

swing-keep-dialog-up-1

Si l'utilisateur tente de fermer la fenêtre:

swing-keep-dialog-up-3

Si l'utilisateur appuie sur le bouton Echap:

swing-keep-dialog-up-4

Cela résume assez bien ce mécanisme. Certains pourraient soutenir que la gestion des entrées utilisateur de la manière traditionnelle où nous vérifierions la valeur de retour desJOptionPane est plus efficace en ressources. Peut etre ou peut etre pas; selon le reste du code, ce mécanicien pourrait être la pièce manquante. Ce qui est certain, c'est que plus vous en savez, plus vous avez de chances de faire le bon choix.