Utilisation d'une "boîte de dialogue"

     

Les fenêtres de dialogue sont des fenêtres que l'ont fait surgir quand on veut indiquer une information, une erreur, donner un avertissement ou encore faire une saisie ponctuelle d'information.

Les classes de base pour travailler avec des fenêtres de dialogue sont les classes javax.swing.JDialog et javax.swing.JOptionPane. La classe JDialog est le cadre du dialogue (la fenêtre elle-même, avec sa barre de titre). Une instance de la classe JOptionPane sert de "panneau intérieur" à une fenêtre de dialogue. Par ailleurs, la classe JOptionPane offre bon nombre de méthodes statiques destinées à faire surgir des fenêtres de dialogue d'un modèle prédéfini ; quatre de nos cinq exemples de fenêtres de dialogue utilise cette possibilité ; on n'utilise alors pas directement la classe JDialog. Si on veut utiliser une fenêtre de dialogue d'un modèle personnalisé, on utilise la classe JDialog à laquelle on associe, comme "panneau intérieur" (par la méthode setContentPane() une instance de JOptionPane.

Nous décrivons ci-dessous, avec des images, ce que fait notre application. Les fenêtres de dialogue qui y sont présentons n'ont pas d'autres justifications que de servir d'exemple.

 

  • Fenêtre principale : les quatres boutons de dialogue permettent d'obtenir quatre fenêtres de dialogues différentes ; le cinquième bouton sert à fermer la quatrième fenêtre de dialogue, lorsqu'elle est ouverte. En bas de la fenêtre, il y a un "label" qui peut être modifié par la plupart de nos fenêtres de dialogue.

     

  • Lorsqu'on appuie sur "dialogue1" dans la fenêtre principale, la fenêtre de dialogue ci-dessous apparaît ; ce n'est pas véritablement un dialogue car ce n'est en fait qu'un texte à lire. Il s'agit ici d'un message d'avertissement, comme on le voit à l'îcone ; on pourrait aussi avoir un message d'information, un message d'erreur, un message sans îcone, un message avec un îcone "par défaut". La fenêtre de dialogue se ferme "normalement" ou en utilisant le bouton OK. Tant que la fenêtre n'est pas fermée, l'action est bloquée : nous dirons que la fenêtre de dialogue est modale.

     

  • Lorsqu'on appuie sur "dialogue2" dans la fenêtre principale, la fenêtre de dialogue ci-dessous apparaît ; cette fenêtre est également modale ; on aurait pu choisir d'avoir aussi un bouton Cancel. Selon la réponse choisie, le label de la fenêtre principale est modifié.

     

  • Lorsqu'on appuie sur "dialogue3" dans la fenêtre principale, la fenêtre de dialogue ci-dessous apparaît ; la fonction de cette fenêtre est très proche de la précédente ; les trois boutons correspondent aux choix Yes et No ci-dessus plus à un bouton Cancel mais ils sont renommés par le programmeur.

     

  • Lorsqu'on appuie sur "dialogue4" dans la fenêtre principale, la fenêtre de dialogue ci-dessous apparaît ; c'est encore une fenêtre modale qui permet de renvoyer à la fenêtre principale le message indiqué dans la zone de texte. Ce message deviendra ici le label de la fenêtre principale.

     

  • Lorsqu'on appuie sur "dialogue5" dans la fenêtre principale, la fenêtre de dialogue ci-dessous apparaît. Cette fenêtre de dialogue est un peu plus complexe à obtenir. Si on appuie sur un des trois boutons, le label de la fenêtre principale est modifié : la chaîne de caractères qui apparaît est le mot porté par le bouton suivi du texte inscrit dans la zone de texte. Nous avons choisi de rendre cette fenêtre de dialogue non modale.

    
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.beans.PropertyChangeListener;
    import java.beans.PropertyChangeEvent;
    
    class EssaiDialogue extends JFrame implements ActionListener
    {
      JLabel label = new JLabel("Essayer les differents boutons");
      MonDialogue monDialogue;
    
      EssaiDialogue()
        {
          JPanel lesBoutons = new JPanel();
          Container interieur = getContentPane();
    
          lesBoutons.setLayout(new GridLayout(6, 2));    
          lesBoutons.add(new Label("un simple avertissement")); 
          ajoute("dialogue1", lesBoutons);   
          lesBoutons.add(new Label("question avec boutons conventionnels"));
          ajoute("dialogue2", lesBoutons);  
          lesBoutons.add(new Label("question avec boutons personnalises")); 
          ajoute("dialogue3", lesBoutons);
          lesBoutons.add(new Label("une facon de faire une saisie"));   
          ajoute("dialogue4", lesBoutons);
          lesBoutons.add(new Label("dialogue personnalisé non modal"));   
          ajoute("dialogue5", lesBoutons);
          lesBoutons.add(new Label("pour fermeture du dialogue ci-dessus"));
          ajoute("fermeture5", lesBoutons);  
          interieur.setLayout(new BorderLayout(5, 5));
          interieur.add(lesBoutons, BorderLayout.CENTER);
          interieur.add(label, BorderLayout.SOUTH);
        }
    
      void ajoute(String s, JPanel lesBoutons)
        {
          Button bouton = new Button(s);;
    
          bouton.setActionCommand(s);
          bouton.addActionListener(this);
          lesBoutons.add(bouton);
        }
    
      public void actionPerformed(ActionEvent e)
        {
          String nom = e.getActionCommand();
    
          if (nom.equals("dialogue1"))
    	JOptionPane.showMessageDialog(this, "Ce n'est qu'un simple message",
    				      "avertissement",
    				      JOptionPane.WARNING_MESSAGE);
          else if (nom.equals("dialogue2"))
    	{
    	  int reponse = JOptionPane.showConfirmDialog(this,
    			       "Etes-vous de bonne humeur ?",
    			       "Etiquettes Java", 
    			        JOptionPane.YES_NO_OPTION);
    	  if (reponse == JOptionPane.YES_OPTION) label.setText("Bravo!");
    	  else if (reponse == JOptionPane.NO_OPTION) label.setText("Courage!");
              else  label.setText("ni l'un ni l'autre ?");
    	}
          else if (nom.equals("dialogue3"))
    	{
    	  String[] choix = {"oui", "non", "pas d'opinion"};
    	  int reponse = JOptionPane.showOptionDialog(this, 
    			       "Etes-vous de bonne humeur ?", 
    			       "Etiquettes du programmeur", 
    			       JOptionPane.YES_NO_CANCEL_OPTION,
    			       JOptionPane.QUESTION_MESSAGE,
    			       null,
    			       choix,
                                   choix[2]);
    	  if (reponse == JOptionPane.YES_OPTION) label.setText("Bravo!");
    	  else if (reponse == JOptionPane.NO_OPTION) label.setText("Courage!");
              else  label.setText("Ni l'un ni l'autre ?");
    	}    
          else if (nom.equals("dialogue4")) 
    	{
    	  String reponse;
    	  String message = "Quel est votre nom ?";
    	  reponse = JOptionPane.showInputDialog(this, message);
    	  label.setText(reponse);
    	}
          else if (nom.equals("dialogue5")) 
    	{
    	  if ((monDialogue != null) && (monDialogue.isVisible())) return;
    	  monDialogue = new MonDialogue(this);
    	  monDialogue.setLocationRelativeTo(this);
              monDialogue.setVisible(true);
    	}
          else if ((nom.equals("fermeture5")) && (monDialogue != null)) 
    	{
    	  monDialogue.dispose();
    	}     
        }
    
      public static void main(String[] argv)
      {
          JFrame monCadre = new EssaiDialogue();
          monCadre.pack();
          monCadre.setVisible(true);
      }
    }
    
    class MonDialogue extends JDialog 
    {
      MonDialogue(EssaiDialogue leCadre) 
        {
          super(leCadre, "Fenetre non modale", false);
    
          final JOptionPane panneauDialogue;
          final JTextField texte = new JTextField(20);
          final EssaiDialogue cadre = leCadre;
          Object[] lesObjets = {"Indiquez un texte", "puis faites un choix",
    			    "regardez le message de la fenetre principale",
    			    texte};
          Object[] choix = {"petit", "grand", "aucun"};
          panneauDialogue = new JOptionPane(lesObjets,
                                JOptionPane.INFORMATION_MESSAGE,
                                JOptionPane.OK_CANCEL_OPTION,
    		            null, choix);
          setContentPane(panneauDialogue);
          pack();
          panneauDialogue.addPropertyChangeListener(
    			      new PropertyChangeListener() 
    		{
    		  public void propertyChange(PropertyChangeEvent e) 
    		    {
    		      cadre.label.setText(panneauDialogue.getValue() 
    					  + " " + texte.getText());
    		    }
    		});
          addWindowListener(new WindowAdapter()
    	        {
    		  public void windowClosing(WindowEvent e)
    		    {
    		      cadre.label.setText("fermeture");
    		    }
    		});
        }
    }
    

    Vous pouvez voir le code en java 5.0 de l'application décrite ici.

         


    bouton.setActionCommand(s); : cette méthode permet de nommer la commande que l'on souhaite déclencher avec le bouton ; c'est utile pour distinguer, dans la méthode actionPerformed par exemple, les différents boutons ; en effet, la méthode actionPerformed de la classe ActionEvent possède la méthode setActionCommand() qui permet de retrouver le nom de la commande associé à un bouton.

    JOptionPane.showMessageDialog(this, "Ce n'est qu'un simple message", "avertissement", JOptionPane.WARNING_MESSAGE); : on obtient, avec cette méthode statique, une fenêtre de dialogue pour un simple message. Le premier paramètre indique la fenêtre "parent" ; le second paramètre donne le message ; le troisième paramètre donne le titre de la fenêtre de dialogue ; le quatrième paramètre donne le type de message et implique l'icône ; les différents choix pour le type de message sont : ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE ou PLAIN_MESSAGE (avec ce dernier, il n'y a pas d'icône). D'autres jeux de paramètres sont disponibles.

    JOptionPane.showConfirmDialog(this, "Etes-vous de bonne humeur ?", "Etiquettes Java", JOptionPane.YES_NO_OPTION); : on obtient ainsi une fenêtre de dialogue pour une question à laquelle on répond grâce aux boutons. Les trois premiers paramètres sont les mêmes que ci-dessus ; le quatrième paramètre permet de choisir l'ensemble des boutons avec deux possibilités : YES_NO_OPTION (boutons Yes et No), ou YES_NO_CANCEL_OPTION (boutons Yes, No et Cancel). La méthode retourne une int qui est une constante de la classe JOptionPane. Cette valeur de retour sera : YES_OPTION, NO_OPTION, CLOSED_OPTION, CANCEL_OPTION.

    JOptionPane.showInputDialog(this, message); : la fenêtre de dialogue disposera ici d'une zone de texte et la réponse sera validée par un bouton OK. D'autres jeux de paramètres sont disponibles.

    JOptionPane(lesObjets, JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, choix); : l'instance construite disposera de plusieurs "objets exposés les uns en-dessous des autres" indiqués par le tableau d'Object(s) lesObjets : trois chaînes de caractères et une zone de saisie de texte. Les noms des boutons sont donnés par le tableau de chaînes de caractères de la variable choix. L'avant-dernier paramètre (ici null) servirait à indiquer une icône particulière.

    monDialogue.setLocationRelativeTo(this); : cette instruction fait que la fenêtre de dialogue vient se situer au centre de la fenêtre "parente".

    monDialogue.dispose(); : cette instruction ferme la fenêtre de dialogue.

    super(leCadre, "Fenetre non modale", false); : on appelle un constructeur de la classe javax.swing.JDialog ; le dernier paramètre demande à ce que la fenêtre ne soit pas modale, ce qui signifie que son ouverture ne bloque pas le processus ; on peut continuer à travailler dans la fenêtre principale sans fermer la fenêtre de dialogue.

    JOptionPane.showOptionDialog(this, "Etes-vous de bonne humeur ?", "Etiquettes du programmeur", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, choix, choix[2]); : la variable choix est ici un tableau de chaînes de caractères donnant les noms des boutons ; le paramètre de valeur choix[2] donne le bouton qui aura le "focus". De la gauche vers la droite, la sélection des boutons conduira à ce que la méthode retourne les constantes YES_OPTION, NO_OPTION, CANCEL_OPTION. S'il y a plus de trois chaînes de caractères dans le tableau choix, les autres boutons correspondent à la constante CANCEL_OPTION.

    panneauDialogue.addPropertyChangeListener... : l'ajout de ce listener permet d'intercepter les clics sur les boutons de choix de la fenêtre de dialogue.

    PropertyChangeListener : il s'agit de l'interface java.beans.PropertyChangeListener. Dans notre application, un événement de type PropertyChangeEvent se produit lorsque l'on change le choix iniqué par les boutons dans la fenêtre de dialogue.

    © Charon Irène, ENST - Paris 2004