Jusqu'ici, nous avons appris à placer des composants dans une fenêtre. En général, ces composants restent affichés en permanence. Or, pour certaines applications, nous avons besoin d'établir un dialogue temporaire avec l'utilisateur. Nous pourrions certes y parvenir en exploitant les possibilités d'ajout ou de suppression dynamique de composants, ou éventuellement en recourant à la méthode setVisible(false). Mais la boîte de dialogue offre une solution beaucoup plus adaptée.
Elle permet en effet de regrouper n'importe quels composants dans une sorte de fenêtre que nous faisons apparaître ou disparaître globalement. Par ailleurs, l'utilisateur est parfaitement habitué à son ergonomie, dans la mesure où elle est très utilisée dans les logiciels du commerce.
Au travers de cette étude, nous allons apprendre à créer et à exploiter de telles boîtes de dialogue en y introduisant les composants de notre choix. Auparavant, nous présenterons quelques boîtes de dialogue standard fournies par Java et qui pourront nous simplifier la tâche dans certaines situations simples : affichage d'un message, demande de confirmation, choix d'une option dans une liste, saisie d'un texte, sélecteur de fichier et sélecteur de couleur.
 l'image de la plupart des systèmes de fenêtrage, AWT fait la distinction entre les boîtes de dialogue modales et non modales :
Il existe également deux autres boîtes de dialogues plus sophistiquées :
Swing propose un ensemble de boîtes de dialogues standard, prêtes à l'emploi, qui permettent de demander à l'utilisateur de fournir une information. Swing a prévu un jeu de dialogues préfabriqués, accessibles à partir de méthodes statiques de la classe JOptionPane. De nombreuses variantes sont possibles ; JOptionPane les classe en quatre groupes de base :
import javax.swing.*; public class Dialogue { public static void main(String[] args) { JOptionPane.showMessageDialog(null, "Bienvenue..."); } }
Cette boîte de dialogue contient les composants suivant : une icône, un message et un bouton OK.
§
Dialogue de confirmation : showConfirmDialog() - Affiche un message et attend une confirmation de la part de l'utilisateur. Les boutons de réponse sont généralement Oui, Non et Annuler.
import javax.swing.*; public class Dialogue { public static void main(String[] args) { JOptionPane.showConfirmDialog(null, "Voulez-vous continuer ?"); } }
Dialoque de saisie : showInputDialog() - Affiche un message et récupère une valeur saisie par l'utilisateur.
import javax.swing.*; public class Dialogue { public static void main(String[] args) { JOptionPane.showInputDialog(null, "Votre nom et prénom :"); } }
La boîte de dialogue de saisie comprend un composant supplémentaire pour recueillir l'entrée de l'utilisateur. Il peut s'agir d'un champ de texte dans lequel il tape une chaîne quelconque, ou d'une zone de liste déroulante dans laquelle il sélectionne une valeur.
Dialogue d'option : showOptionDialog() - Le type le plus général, vous lui passez vos propres composants, qui se retrouvent affichés dans le dialogue, comme des boîtes combo, un ensemble de boutons, un ensemble d'objets hétérogènes.
import javax.swing.*; public class Dialogue { public static void main(String[] args) { JTextField utilisateur = new JTextField(); JPasswordField passe = new JPasswordField(); JOptionPane.showOptionDialog(null, new Object[] {"Votre nom :", utilisateur, "Mot de passe :", passe}, "Connexion", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null); } }
Avec la méthode showOptionDialog(), vous pouvez spécifier un ensemble arbitraire d'options en fournissant un tableau d'objets. Chaque élément du tableau est traité de la façon suivante :
Les dialogues affichés par JOptionPane sont modaux, ce qui signifie, nous l'avons déjà vu, qu'ils bloquent les autres entrées de l'application lorsqu'ils sont affichés.
L'icône placée à gauche dans la boîte de dialogue standard dépend du type de message. Il en existe cinq :
Le type PLAIN_MESSAGE ne possède pas d'icône. Pour chaque type de boîte de dialogue, il existe la méthode setIcon() vous permettant de fournir votre propre icône.
Vous pouvez spécifier un message pour chaque type de boîte de dialogue. Ce message peut être une chaîne, une icône, un composant d'interface utilisateur ou tout autre objet. Voici comment est affiché l'objet message suivant son type :
Bien sûr, le message le plus fréquent est celui de type chaîne. Un objet Component offre une souplesse optimale puisque vous pouvez redéfinir la méthode paintComponent() pour dessiner tout ce que vous souhaitez.
Astuce : Une chaîne de message peut contenir des caractères de fin de ligne ('\n'). L'affichage est alors réparti sur plusieurs lignes.
§
Les boutons situés en bas de la boîte de dialogue dépendent de son type et du type d'option. Les méthodes showMessageDialog() et showInputDialog() implémentent uniquement un jeu standard de boutons (respectivement OK et OK/Cancel).
Au lieu d'utiliser l'une des méthodes statiques pour afficher un dialogue JOptionPane, nous pouvons aussi créer directement un objet (de type JOptionPane) avec les propriétés désirées. Ces réglages sont ainsi conservés dans le temps. Une fois que vous avez créé votre objet en choisissant le constructeur le plus adapté, vous devez faire appel ensuite à la méthode createDialog() qui fabriquera réellement votre boîte de dialogue en fonction des propriétés que vous avez choisies de mettre en place.
Voici la liste des constructeurs qui sont à votre disposition :
import javax.swing.*; public class Dialogue { public static void main(String[] args) { JOptionPane dialogue = new JOptionPane("Bonjour à tous", JOptionPane.INFORMATION_MESSAGE); JDialog boîte = dialogue.createDialog("Bienvenue"); boîte.setVisible(true); } }
Il existe une deuxième méthode createDialog() qui possède deux paramètres et qui prend en premier argument la fenêtre parente afin de bien mettre en oeuvre une boîte de dialogue modale.
Pour toutes ces raisons, il généralement souhaitable d'utiliser plutôt les méthodes statiques de JOptionPane et de choisir la plus adaptée à la situation requise.
La diversité des choix peut sembler déconcertant, mais en pratique c'est très simple :
Dans les chapitres qui suivent, nous allons reprendre chacune de ces boîtes de dialogue, afin d'exploiter au maximun les possibilités qui nous sont offertes.
§
Java dispose de méthodes standard vous permettant de fournir à l'utilisateur un message qui reste affiché tant qu'il n'agit pas sur un bouton OK. Plus précisément, la classe JOptionPane dispose de la méthode statique showMessageDialog(), vue plus haut, permettant d'afficher et de gérer automatiquement une telle boîte. Cette méthode dispose de plusieurs variantes dont la liste est fournie ci-dessous.
Remarquez au passage que cette méthode statique ne renvoie aucune valeur, ce qui est normal puisqu'il s'agit juste de proposer un message d'information correspondant à la situation actuelle de l'application.
Dans la suite de ce chapitre, nous allons prendre pleins d'exemples, de la boîte de dialogue la plus rudimentaire (souvent suffisante) à la plus sophistiquée, afin de bien montrer tous les réglages et toutes les configurations qu'il est possible de faire sur une simple boîte de dialogue de message. Bien entendu, nous pourrons faire ses mêmes réglages sur les autres types de boîte de dialogue.
Venons-en tout de suite à notre premier exemple. Une fenêtre principale d'application possède un bouton qui permet d'activer une boîte de dialogue qui nous renseigne sur l'heure qu'il est. Nous utilisons pour cela la boîte de message la plus rudimentaire :
import java.awt.*; import java.awt.event.*; import java.text.*; import java.util.Date; import javax.swing.*; public class Dialogue extends JFrame implements ActionListener { private JButton heure = new JButton("Quel heure est-il ?"); public Dialogue() { super("Dialogue..."); add(heure, BorderLayout.SOUTH); heure.addActionListener(this); getContentPane().setBackground(Color.ORANGE); setSize(300, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new Dialogue(); } public void actionPerformed(ActionEvent e) { SimpleDateFormat heure = new SimpleDateFormat("HH 'h' mm 'mn'"); JOptionPane.showMessageDialog(this, heure.format(new Date())); } }
On notera que le premier argument de la méthode showMessageDialog() représente ce que nous nommons - la fenêtre parent (ou propriétaire) - de la boîte de message ; c'est-à-dire celle dans laquelle elle va s'afficher. Remarquez d'ailleurs que la boîte de dialogue ce centre automatiquement par rapport à la fenêtre propriétaire.
Il est cependant possible d'afficher une boîte de dialogue indépendamment de toute fenêtre, en donnant à ce premier paramètre la valeur null :
import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JOptionPane; public class Dialogue { public static void main(String[] args) { SimpleDateFormat heure = new SimpleDateFormat("HH 'h' mm 'mn'"); JOptionPane.showMessageDialog(null, heure.format(new Date())); } }
La boîte de message usuelle ne permet de définir que le contenu du message. Son titre (Message) et l'icône qu'elle renferme -
: lettre i comme "information" - sont imposés. Il existe une autre variante de la méthode showMessageDialog() qui permet de choisir :
import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JOptionPane; public class Dialogue { public static void main(String[] args) { SimpleDateFormat heure = new SimpleDateFormat("HH 'h' mm 'mn'"); JOptionPane.showMessageDialog(null, heure.format(new Date()), "Heure actuelle", JOptionPane.WARNING_MESSAGE); } }
Il existe une troisième variante qui, outre les paramètres précédents, permet de choisir une icône quelconque (objet de la classe Icon) qui remplace l'une des icônes standard.
A ce sujet, il est préférable de stipuler la constante JOptionPane.PLAIN_MESSAGE pour bien indiquer que nous choisissons une icône personnalisée. Ceci dit, vous avez la possibilité de proposer un autre choix, cela fonctionnera exactement de la même manière.
import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.*; public class Dialogue { public static void main(String[] args) { SimpleDateFormat heure = new SimpleDateFormat("HH 'h' mm 'mn'"); JOptionPane.showMessageDialog(null, heure.format(new Date()), "Heure actuelle", JOptionPane.PLAIN_MESSAGE, new ImageIcon("montre.gif")); } }
Jusqu'à présent, le type de message que j'utilise est tout simplement une chaîne de caractères (de type String). Je rappelle que ce message peut être une chaîne, une icône, un composant d'interface utilisateur ou tout autre objet. Voici d'ailleurs comment est affiché l'objet message suivant son type :
Bien sûr, le message le plus fréquent est celui de type chaîne. Un objet Component offre une souplesse optimale puisque vous pouvez redéfinir la méthode paintComponent() pour dessiner tout ce que vous souhaitez.
Astuce : Une chaîne de message peut contenir des caractères de fin de ligne ('\n'). L'affichage est alors réparti sur plusieurs lignes.
§
import java.awt.*; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.*; public class Dialogue { public static void main(String[] args) { SimpleDateFormat heure = new SimpleDateFormat("HH 'h' mm 'mn'"); JLabel message = new JLabel(heure.format(new Date()), new ImageIcon("montre.gif"), JLabel.RIGHT); message.setFont(new Font("Arial", Font.BOLD+Font.ITALIC, 24)); message.setForeground(Color.RED); message.setHorizontalTextPosition(JLabel.LEFT); JOptionPane.showMessageDialog(null, message, "Heure actuelle", JOptionPane.INFORMATION_MESSAGE); } }
import java.text.*; import java.util.Date; import javax.swing.*; public class Dialogue { public static void main(String[] args) { DateFormat date = DateFormat.getDateInstance(DateFormat.FULL); SimpleDateFormat heure = new SimpleDateFormat("HH 'h' mm 'mn'"); String[] message = {date.format(new Date()), heure.format(new Date())}; JOptionPane.showMessageDialog(null, message, "Aujourd'hui", JOptionPane.PLAIN_MESSAGE, new ImageIcon("montre.gif")); } }
Il est possible de prévoir un tableau de JLabel en lieu et place de ce tableau de chaîne afin de permettre le formatage personnalisé du texte.
§
import java.text.*; import java.util.Date; import javax.swing.*; public class Dialogue { public static void main(String[] args) { DateFormat date = DateFormat.getDateInstance(DateFormat.FULL); SimpleDateFormat heure = new SimpleDateFormat("HH 'h' mm 'mn'"); String[] message = {date.format(new Date()), heure.format(new Date())}; JOptionPane.showMessageDialog(null, new JComboBox(message), "Aujourd'hui", JOptionPane.PLAIN_MESSAGE, new ImageIcon("montre.gif")); } }
import java.awt.*; import java.awt.event.*; import java.util.Calendar; import javax.swing.*; public class Dialogue { public static void main(String[] args) { Horloge horloge = new Horloge(); JOptionPane.showMessageDialog(null, horloge, "Horloge", JOptionPane.INFORMATION_MESSAGE); horloge.arrêt(); } } class Horloge extends JComponent implements ActionListener { private Timer timer = new Timer(100, this); private double heure; private double minute, seconde; public Horloge() { setPreferredSize(new Dimension(240, 190)); timer.start(); } public void arrêt() { timer.stop(); } @Override protected void paintComponent(Graphics g) { Graphics2D dessin = (Graphics2D) g; dessin.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); dessin.setStroke(new BasicStroke(5)); dessin.drawOval(5, 5, 181, 181); dessin.setStroke(new BasicStroke(2)); dessin.drawLine(96, 5, 96, 183); dessin.drawLine(5, 96, 183, 96); dessin.setStroke(new BasicStroke(10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); dessin.setPaint(new Color(0.0F, 0.0F, 1.0F, 0.5F)); dessin.drawLine(96, 96, (int) (96 + 50*Math.cos((heure-3) * 2.0 * Math.PI / 12)), (int) (96 + 50*Math.sin((heure-3) * 2.0 * Math.PI / 12))); dessin.drawLine(96, 96, (int) (96 + 70*Math.cos((minute-15) * 2.0 * Math.PI / 60)), (int) (96 + 70*Math.sin((minute-15) * 2.0 * Math.PI / 60))); dessin.setPaint(new Color(1.0F, 0.0F, 0.0F, 0.5F)); dessin.drawLine(96, 96, (int) (96 + 80*Math.cos((seconde-15) * 2.0 * Math.PI / 60)), (int) (96 + 80*Math.sin((seconde-15) * 2.0 * Math.PI / 60))); } public void actionPerformed(ActionEvent e) { Calendar horaire = Calendar.getInstance(); minute = horaire.get(Calendar.MINUTE); seconde = horaire.get(Calendar.SECOND); heure = horaire.get(Calendar.HOUR)+minute/60; repaint(); } }
Nous voyons ici toute la puissance des boîtes de dialogue standard. Rien empêche donc de créer le composant qui vous plait et de le placer ensuite dans votre boîte de dialogue, qui constitue ainsi votre message principal. Ici, nous voyons notre horloge qui fonctionne en temps réel avec l'aiguille des secondes qui se déplace automatiquement.
import java.awt.*; import java.awt.event.*; import java.text.DateFormat; import java.util.Calendar; import javax.swing.*; public class Dialogue { public static void main(String[] args) { DateFormat aujourdhui = DateFormat.getDateInstance(DateFormat.FULL); Horloge horloge = new Horloge(); JLabel date = new JLabel(aujourdhui.format(System.currentTimeMillis())); date.setFont(new Font("ARIAL", Font.BOLD+Font.ITALIC, 20)); Object[] date_heure = {date, horloge}; JOptionPane.showMessageDialog(null, date_heure, "Horloge", JOptionPane.INFORMATION_MESSAGE); horloge.arrêt(); } } class Horloge extends JComponent implements ActionListener { private Timer timer = new Timer(100, this); private double heure; private double minute, seconde; public Horloge() { setPreferredSize(new Dimension(240, 190)); timer.start(); } public void arrêt() { timer.stop(); } @Override protected void paintComponent(Graphics g) { Graphics2D dessin = (Graphics2D) g; dessin.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); dessin.setStroke(new BasicStroke(5)); dessin.drawOval(5, 5, 181, 181); dessin.setStroke(new BasicStroke(2)); dessin.drawLine(96, 5, 96, 183); dessin.drawLine(5, 96, 183, 96); dessin.setStroke(new BasicStroke(10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); dessin.setPaint(new Color(0.0F, 0.0F, 1.0F, 0.5F)); dessin.drawLine(96, 96, (int) (96 + 50*Math.cos((heure-3) * 2.0 * Math.PI / 12)), (int) (96 + 50*Math.sin((heure-3) * 2.0 * Math.PI / 12))); dessin.drawLine(96, 96, (int) (96 + 70*Math.cos((minute-15) * 2.0 * Math.PI / 60)), (int) (96 + 70*Math.sin((minute-15) * 2.0 * Math.PI / 60))); dessin.setPaint(new Color(1.0F, 0.0F, 0.0F, 0.5F)); dessin.drawLine(96, 96, (int) (96 + 80*Math.cos((seconde-15) * 2.0 * Math.PI / 60)), (int) (96 + 80*Math.sin((seconde-15) * 2.0 * Math.PI / 60))); } public void actionPerformed(ActionEvent e) { Calendar horaire = Calendar.getInstance(); minute = horaire.get(Calendar.MINUTE); seconde = horaire.get(Calendar.SECOND); heure = horaire.get(Calendar.HOUR)+minute/60; repaint(); } }
Là encore, nous pouvons décider d'avoir une boîte de message extrêment riche. Grâce aux tableaux d'objets (Object[]), vous pouvez vraiment placer l'ensemble des éléments qui vous passent par la tête.
Java permet d'afficher des boîtes dites "de confirmation" offrant à l'utilisateur un choix de type Oui/Non. Il suffit pour cela de recourir à l'une des variantes de la méthode statique showConfirmDialog() de la classe JOptionPane :
Les arguments composantParent, message, titre, typeMessage et icône de ces méthodes sont les mêmes que pour les dialogues de message. Les dialogues de confirmation ajoutent un argument typeOption et une valeur de retour.
L'argument typeOption indique quel bouton doit apparaître dans le dialogue et vous permet de choisir parmi les quatres constantes suivantes :
Cette dernière valeur indique que l'utilisateur a fermé la fenêtre de dialogue sans sélectionner l'un des boutons disponibles ; elle doit généralement être traitée comme une réponse CANCEL_OPTION.
A titre d'exemple, je vous propose de prendre la première méthode showConfirmDialog() qui sera dans la plupart des cas largement suffisante. Par ailleurs, très souvent, avant de quitter une application, il est souhaitable de prévenir l'utilisateur pour que ce dernier confirme la sortie du programme, surtout si il doit penser à enregistrer ses dernières modifications effectuées dans un document.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Dialogue extends JFrame { public Dialogue() { super("Dialogue..."); getContentPane().setBackground(Color.ORANGE); setSize(300, 200); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { if (JOptionPane.showConfirmDialog(Dialogue.this, "Désirez-vous quitter l'application ?") == JOptionPane.YES_OPTION) System.exit(0); } }); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new Dialogue(); } }
La boîte reste affichée jusqu'à ce que l'utilisateur agisse sur l'un des boutons ou qu'il ferme la boîte. La valeur de retour de la méthode showConfirmDialog() précise l'action effectuée par l'utilisateur, sous forme d'un entier ayant comme valeur l'une des constantes suivantes de la classe JOptionPane :
Notez que les constantes CANCEL_OPTION et CLOSED_OPTION sont différentes. En pratique, nous exploitons rarement cette particularité. Généralement, nous considérons que dans les deux cas, nous avons affaire à un abandon du dialogue.
La boîte de confirmation usuelle que nous venons de présenter permet seulement le choix de la question posée à l'utilisateur. Il existe une autre variante de la méthode showConfirmDialog() qui permet en outre de choisir le titre de la boîte, ainsi que la nature des boutons qui s'y trouvent. Ceux-ci sont définis par un paramètre entier dont la valeur est choisie parmi les constantes suivantes :
Il existe deux autres versions de la méthode statique showConfirmDialog() qui permettentde choisir en plus l'une des icônes standard où même une icône personnalisée.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Dialogue extends JFrame { public Dialogue() { super("Dialogue..."); getContentPane().setBackground(Color.ORANGE); setSize(300, 200); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { switch (JOptionPane.showConfirmDialog(Dialogue.this, "Désirez-vous quitter l'application ?","Sortir du programme", JOptionPane.YES_NO_OPTION)) { case JOptionPane.YES_OPTION : System.exit(0); case JOptionPane.CLOSED_OPTION : { JLabel alerte = new JLabel("Attention, vous devez faire un choix !"); alerte.setForeground(Color.RED); int choix; while ((choix = JOptionPane.showConfirmDialog(Dialogue.this, new Object[] {alerte, "Désirez-vous quitter l'application ?"}, "Sortir du programme", JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE))==JOptionPane.CLOSED_OPTION); if (choix==JOptionPane.YES_OPTION) System.exit(0); } } } }); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new Dialogue(); } }
Bien que cela ne soit pas prévu à priori, il est tout à fait possible de prendre n'importe quel composant pour constituer notre message, et pourquoi pas un composant spécialisé dans la saisie comme un JFormattedTextField.
Bien sûr, dans le chapitre suivant nous ferrons appel à la méthode showInputDialog() de la classe JOptionPane qui est justement prévue pour la saisie, mais c'est encore une fois pour montrer la grande souplesse d'utilisation de ces méthodes statiques, notamment dans le choix du type de message.

Si l'utilisateur clique sur Annuler le programme s'arrête alors sans effectuer de calcul. Par contre, si l'utilisateur clique sur le bouton OK, un traitement est réalisé et la conversion en franc est alors proposée dans une boîte de message adaptée.
L'utilisateur peut effectuer autant de calculs qu'il le désire jusqu'à ce qu'il clique sur le bouton Annuler de la boîte de confirmation.
import java.awt.Color; import java.text.*; import javax.swing.*; public class Dialogue { public static void main(String[] args) { JFormattedTextField saisie = new JFormattedTextField(NumberFormat.getCurrencyInstance()); saisie.setValue(0); Object[] message = {"Votre valeur en €uro :", saisie}; while (JOptionPane.showConfirmDialog(null, message, "Conversion € => F", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.YES_OPTION) { double €uro = ((Number)saisie.getValue()).doubleValue(); final double CONVERSION = 6.55957; JFormattedTextField franc = new JFormattedTextField(new DecimalFormat("#,##0.00 F")); franc.setEditable(false); franc.setForeground(Color.RED); franc.setValue(€uro*CONVERSION); String motif = "{0, number, currency}uro{0, choice, 0#|2#s} {0, choice, 0#fait|2#font} en Franc{0, choice, 0#|0.31#s} :"; Object[] résultat = {MessageFormat.format(motif, €uro), franc}; JOptionPane.showMessageDialog(null, résultat); } } }
La boîte de saisie permet à l'utilisateur de fournir une information sous la forme d'une chaîne de caractères. La méthode statique showInputDialog() de la classe JOptionPane vous permet de gérer automatiquement le dialogue avec l'utilisateur.
Quand nous passons un tableau de valeursSélection à showInputDialog(), la valeur de retour est celle que l'utilisateur aura choisi, ou null si l'utilisateur n'a pas sélectionné le bouton OK.
Comme d'habitude, je vous propose de mettre en place une boîte de saisie la plus simple possible. Effectivement, nous allons utiliser la méthode showInputDialog() qui possède comme seul argument le message désiré, ici "Nom du fichier :". Nous construisons une application qui permet de consulter un document enregistré dans un fichier. Dès que le programme débute, la boîte de saisie apparaît en nous demandant d'introduire le nom du fichier désiré. Si ce nom est correct, une fenêtre est alors créée et nous montre le document concerné. Dans le cas contraire, une boîte de message est alors proposée nous indiquant notre erreur de saisie à l'issu de quoi, le programme s'arrête.

import java.awt.Color; import java.io.*; import javax.swing.*; public class Dialogue { public static void main(String[] args) { String nomFichier = JOptionPane.showInputDialog("Nom du fichier :"); try { JTextArea document = new JTextArea(); document.setBackground(Color.ORANGE); document.read(new FileReader(nomFichier), null); JFrame fenetre = new JFrame(nomFichier); fenetre.add(new JScrollPane(document)); fenetre.setDefaultCloseOperation(fenetre.EXIT_ON_CLOSE); fenetre.setSize(400, 300); fenetre.setVisible(true); } catch (IOException ex) { JOptionPane.showMessageDialog(null, "ATTENTION, le fichier ("+nomFichier+") n'existe pas", "Alerte", JOptionPane.ERROR_MESSAGE); } } }
Nous remarquons que c'est vraiment très facile de construire une boîte de saisie. Il existe bien entendu plein de variantes dont nous connaissons bien les principes maintenant, et je ne vais d'ailleurs pas m'y attarder. Je vous propose toutefois de travailler avec la dernière méthode showInputDialog() puisqu'elle est un peu plus particulière dans le sens où il est possible de proposer un choix parmi un ensemble de valeurs prédéfinies.
import java.text.*; import java.util.Date; import javax.swing.*; public class Dialogue { public static void main(String[] args) { DateFormat date = DateFormat.getDateInstance(DateFormat.FULL); SimpleDateFormat heure = new SimpleDateFormat("HH 'h' mm 'mn'"); String[] sélections = {"Date", "Heure", "Date et heure"}; String choix = (String)JOptionPane.showInputDialog(null, "Faites votre choix ?", "Date et heure", JOptionPane.QUESTION_MESSAGE, null, sélections, null); if (choix.equals("Date")) { String message = date.format(new Date()); JOptionPane.showMessageDialog(null, message, choix, JOptionPane.INFORMATION_MESSAGE); } else if (choix.equals("Heure")) { String message = heure.format(new Date()); JOptionPane.showMessageDialog(null, message, choix, JOptionPane.INFORMATION_MESSAGE); } else { String[] message = {date.format(new Date()), heure.format(new Date())}; JOptionPane.showMessageDialog(null, message, choix, JOptionPane.INFORMATION_MESSAGE); } } }
Il existe une dernière boîte de dialogue prédéfinie qui s'appelle tout simplement boîte d'options. Cette boîte d'options, représentée par la méthode statique showOptionDialog(), généralise en fait la boîte de dialogue de confirmation. Il existe effectivement un argument supplémentaire, appelé options, qui indique quels boutons afficher dans la boîte de dialogue. Ils remplacent alors les boutons traditionnels, comme OK/Annuler. Vous pouvez ainsi proposer des libellés qui correspondent plus précisément à votre application.
Dans cet argument options, nous spécifions typiquement un tableau de chaînes que JOptionPane affiche dans des composants JButton. Ces boutons s'affichent alors sur la même ligne. Rien n'empêche toutefois de choisir d'autres types de composants, comme des zones de saisie, des libellés, etc.
La valeur de retour est, comme pour la boîte de confirmation, de type entier. Le nombre retourné correpond à l'ordre de placement des boutons en commençant par 0. Ainsi, si vous cliquez sur le troisième bouton, c'est le chiffre 2 qui est renvoyée par la boîte de dialogue.
A titre d'exemple, je vous propose de fabriquer une boîte de dialogue qui permet de nous connecter à un service particulier. Nous pouvons nous connecter à ce service soit de façon anonyme, c'est-à-dire tout public, ou éventuellement en mode privé auquel cas, vous devez alors donner votre nom d'utilisateur et spécifier votre mot de passe.

import javax.swing.*; public class Dialogue { public static void main(String[] args) { JTextField utilisateur = new JTextField(); JPasswordField motDePasse = new JPasswordField(); int choix = JOptionPane.showOptionDialog(null, new Object[] {"Votre nom :", utilisateur, "Mot de passe :", motDePasse}, "Connexion", JOptionPane.NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[] {"Mode privé", "Anonyme", "Annuler"}, null); switch (choix) { case 0 : if (utilisateur.getText().equalsIgnoreCase("Emmanuel REMY") && motDePasse.getText().equals("manu")) JOptionPane.showMessageDialog(null, "Vous êtes connecté en mode privé"); else JOptionPane.showMessageDialog(null, new String[] {"Utilisateur inconnu", "ou mot de passe incorrecte"}, "Connexion en mode privée refusée", JOptionPane.ERROR_MESSAGE); break; case 1 : JOptionPane.showMessageDialog(null, "Vous êtes connecté en mode tout public"); break; default : JOptionPane.showMessageDialog(null, "Non connecté...", "ATTENTION", JOptionPane.ERROR_MESSAGE); break; } } }
Bien entendu, vous n'êtes pas obligé de prendre en compte l'argument options (vous proposez alors la valeur null) de cette méthode showOptionDialog(). Dans ce cas là, il vous faut préciser les boutons standards que vous désirez voir apparaître au travers de l'argument typeOption.

import javax.swing.*; public class Dialogue { public static void main(String[] args) { JTextField utilisateur = new JTextField(); JPasswordField motDePasse = new JPasswordField(); int choix = JOptionPane.showOptionDialog(null, new Object[] {"Votre nom :", utilisateur, "Mot de passe :", motDePasse}, "Connexion", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null); if (choix == JOptionPane.OK_OPTION) if (utilisateur.getText().equalsIgnoreCase("Emmanuel REMY") && motDePasse.getText().equals("manu")) JOptionPane.showMessageDialog(null, "Vous êtes connecté"); else JOptionPane.showMessageDialog(null, new String[] {"Utilisateur inconnu", "ou mot de passe incorrecte"}, "Connexion refusée", JOptionPane.ERROR_MESSAGE); else JOptionPane.showMessageDialog(null, "Non connecté...", "ATTENTION", JOptionPane.ERROR_MESSAGE); } }
La particularité de la boîte d'options par rapport à la boîte de confirmation c'est uniquement le nombre de boutons que vous désirez placer dans la boîte de dialogue et le choix de leurs libellés. Si vous ne désirez pas créer de nouveaux boutons et si vous préférez plutôt utiliser les boutons standards, autant choisir une boîte de dialogue de type confirmation, dont la méthode showConfirmDialog() possède moins d'arguments à prendre en compte.
