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:
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.
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:
Si l'utilisateur tente de fermer la fenêtre:
Si l'utilisateur appuie sur le bouton Echap:
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.