Les dialogues

 

Les dialogues sont des conteneur de premier niveau ( comme JFrame) : ils ne sont pas contenus dans d’autres cadres, mais dépendent d’un autre cadre. Lorsqu’un cadre est fermé ( ou iconifié ) les cadres qui en dépendent sont fermés ( ou iconifiés ).

Un dialogue peut être : 

·        modal : lorsqu’il est actif toute interaction avec les autres fenêtres sont bloquées. Les dialogues JOptionPane sont modaux

·        non modal : ne bloque pas les interactions avec les autres fenêtres : pour créer un dialogue non modal, on est obligé de passer par la classe JDialog.

 

JOptionPane.

La classe JOptionPane fournit des façon simples de créer des dialogues élémentaires  modaux en spécifiant un message, un titre, une icône, et un type de message ou un type d’option.

Si on ne spécifie pas d’icône, des icônes sont fournies par le système en fonction du type de message.

 

Dialogue d’information : 

 

L’appel de la méthode showMessageDialog de la classe JOptionPane permet de faire apparaître des messages : 

Frame getFrame() { // récupération de la frame de l'applet

     Component component=this;

     do{

        component=component.getParent();

     } while(!(component instanceof Frame));

     return (Frame)component;

  }

 

JOptionPane d = new JOptionPane();

d.showMessageDialog( getFrame(),

                     "le message",

                     "le titre",

                      messageType);

 

Le type de message est l’une des valeurs suivantes : 

·        JOptionPane.PLAIN_MESSAGE;

·        JOptionPane.ERROR_MESSAGE;

·        JOptionPane.INFORMATION_MESSAGE;

·        JOptionPane.WARNING_MESSAGE;

·        JOptionPane.QUESTION_MESSAGE;

 

Dialogue de confirmation : 

L’appel de la méthode showConfirmDialog de la classe JOptionPane permet de faire apparaître des messages, avec demande de confirmation : 

 

JOptionPane d = new JOptionPane();

int retour = d.showConfirmDialog(getFrame(),

                                 "le message",

                                 "le titre",

                                 optionType);

 

l’option de message est l’une des valeurs suivantes : 

 

·        JOptionPane.DEFAULT_OPTION;

·        JOptionPane.YES_NO_OPTION;

·        JOptionPane.YES_NO_CANCEL_OPTION;

·        JOptionPane.OK_CANCEL_OPTION;

 

La valeur retournée par l’appel de méthode est l’une des trois suivantes : OK_OPTION, NO_OPTION ou CANCEL_OPTION.

 

Dialogue de saisie : 

 

L’appel de la méthode showInputDialog de la classe JOptionPane permet de faire une saisie de chaîne de caractères : 

 

JOptionPane d = new JOptionPane();

String retour = d.showInputDialog(getFrame(),

                                 "le message\n et la suite",

                                 "le titre",

                                 messageType);

 

si retour vaut  null la saisie n’est pas validée, sinon retour vaut la chaîne tapée par l’utilisateur.

 

Dialogue avec boutons personnalisés: 

 

 

JOptionPane d = new JOptionPane();

// les textes figurant sur les boutons

String lesTextes[]={ "bonjour",    "au revoir",

                     "bonne nuit", "bonne année"};

int  retour  = // indice du bouton qui a été cliqué ou CLOSED_OPTION

     d.showOptionDialog(getFrame(), "le message", "le titre",

                         optionType, messageType,

                         null,           // pas d’icone

                         lesTextes,      // les testes de boutons

                         lesTextes[0]);  // le bouton par défaut

      if( retour!=JOptionPane.CLOSED_OPTION)  … ;// un bouton cliqué

      else ;                                     // pas de bouton cliqué

 


JDialog

 

La classe JDialog permet de fabriquer des boîtes de dialogue complètement personnalisées.

 

Constructeurs :

 

JDialog (Dialog owner)

Construit une boîte de dialogue dépendant de owner, non modale

JDialog (Dialog owner, String titre)

Construit une boîte de dialogue dépendant de owner, avec un titre, et non modale

JDialog (Dialog owner, String titre, boolean modal)

Construit une boîte de dialogue dépendant de owner, avec un titre, et une modalité

JDialog (Frame owner)

Construit une boîte de dialogue dépendant de owner et non modale

JDialog (Frame owner, boolean modal)

Construit une boîte de dialogue dépendant de owner, avec une modalité

JDialog (Frame owner, String titre)

Construit une boîte de dialogue dépendant de owner, avec un titre, et non modale

JDialog (Frame owner, String titre, boolean modal)

Construit une boîte de dialogue dépendant de owner, avec un titre, et une modalité

 

Principales méthodes : 

 

voiddispose()

Détruit la boîte de dialogue

String getTitle()

Retourne le titre de la boîte de dialogue 

voidhide()

Cache la boîte de dialogue 

booleanisModal()

Retourne vrai si la boîte est modale 

booleanisResizable()

Indique si on peut redimensionner la boîte  

voidsetModal(boolean b)

Positionne la modalité 

voidsetResizable(boolean resizable)

Positionne la possibilité de redimensionner. 

voidsetTitle(String title)

Change le titre de la boîte 

voidshow() 

Rend la boîte visible.

 

Exemple : 

 

public class MonDialogue extends JDialog {

   // les données mises à jour par la boîte de dialogue

  Integer lEntier = new Integer(0);

  String leNom;

 

  public MonDialogue(JFrame f, String titre, boolean modal) {

       super(f,titre, modal);

       try {

          jbInit();

       }

       catch(Exception e) {

          e.printStackTrace();

       }

  }

 

  // initialise les valeurs de la boîte de dialogue

  // avec les valeurs contenues dans le tableau

  publicvoid initialise( Object [] o){

      lEntier = (Integer)o[0];

      leNom = (String)o[1];

      jTextField1.setText(lEntier.toString());

      jTextField2.setText(leNom);

  }

 

  public void show(Object [] o){

       initialise(o);

       show();

  }

  // récupère les données mises à jour par la boîte de dialogue

  publicObject [] getDonnees(){

      return new Object[]{lEntier,leNom};

  }

  // les methodes de réponse aux boutons OK et Cancel

  voidjButtonOK_actionPerformed(ActionEvent e) {

    messages.setText(" ");

    try{

       lEntier = new Integer(jTextField1.getText());

       leNom = jTextField2.getText();

       hide();

    }catch(NumberFormatException nfe){

       messages.setText("entrer un entier !");

    }

  }

 

  void jButtonCANCEL_actionPerformed(ActionEvent e) {

     messages.setText(" ");

     hide();

  }

 

  // l’interface

  public MonDialogue() {

    try {

      jbInit();

    }

    catch(Exception e) {

      e.printStackTrace();

    }

  }

 

  BorderLayout borderLayout1 = new BorderLayout();

  JPanel jPanel1 = new JPanel();

  JTextField jTextField1 = new JTextField();

  JPanel jPanel2 = new JPanel();

  JButton jButton1 = new JButton();

  JButton jButton2 = new JButton();

  GridLayout gridLayout1 = new GridLayout();

  TitledBorder titledBorder1;

  JLabel jLabel1 = new JLabel();

  JLabel jLabel2 = new JLabel();

  JTextField jTextField2 = new JTextField();

  JLabel messages = new JLabel();

 

  private void jbInit() throws Exception {

    titledBorder1 = new TitledBorder("");

    jTextField1.setText("jTextField1");

    jTextField1.setBounds(new Rectangle(101, 24, 92, 21));

    jButton1.setText("OK");

    jButton1.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {

        jButtonOK_actionPerformed(e);

      }

    });

    jButton2.setText("Annuler");

    jButton2.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {

        jButtonCANCEL_actionPerformed(e);

      }

    });

    jPanel2.setLayout(gridLayout1);

    gridLayout1.setRows(4);

    gridLayout1.setColumns(1);

    gridLayout1.setVgap(5);

    jPanel2.setBorder(BorderFactory.createEtchedBorder());

    jPanel1.setBorder(BorderFactory.createEtchedBorder());

    jPanel1.setPreferredSize(new Dimension(200, 1));

    jPanel1.setLayout(null);

    jLabel1.setFont(new java.awt.Font("Dialog", 0, 14));

    jLabel1.setHorizontalAlignment(SwingConstants.RIGHT);

    jLabel1.setText("un entier");

    jLabel1.setBounds(new Rectangle(18, 24, 75, 17));

    jLabel2.setFont(new java.awt.Font("Dialog", 0, 14));

    jLabel2.setHorizontalAlignment(SwingConstants.RIGHT);

    jLabel2.setText("un nom");

    jLabel2.setBounds(new Rectangle(18, 56, 75, 17));

    jTextField2.setText("jTextField2");

    jTextField2.setBounds(new Rectangle(101, 57, 92, 21));

    messages.setForeground(Color.red);

    messages.setText(" ");

    this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);

    this.setResizable(false);

    jPanel1.add(jLabel1, null);

    jPanel1.add(jTextField1, null);

    jPanel1.add(jLabel2, null);

    jPanel1.add(jTextField2, null);

    this.getContentPane().add(messages,  BorderLayout.SOUTH);

    this.getContentPane().add(jPanel2,  BorderLayout.EAST);

    jPanel2.add(jButton1, null);

    jPanel2.add(jButton2, null);

    this.getContentPane().add(jPanel1,  BorderLayout.CENTER);

  }

 

}

 

Pour utiliser la boîte de dialogue il faut  : 

 

MonDialogue md1 = new MonDialogue(getFrame(),

                                  "exemple avec JDialog modal",

                                  true);

md1.pack();

Puis :

 

md1.initialise(new Object[]{i, nom});

md1.show();

Object [] retour = md1.getDonnees();

i = (Integer)retour[0];

nom = (String)retour[1];

 

Si on veut empêcher la fermeture de la boîte de dialogue par le bouton de fermeture, i suffit d’affecter à la propriété defaultCloseOperation la valeur DO_NOTHING_ON_CLOSE.