User Tools

Site Tools


documentation:dialog_box

Boîtes de dialogue - transmission des paramètres saisis

On peut envisager plusieurs manières pour la transmission des paramètres saisis dans une boîte de dialogue vers l'objet appelant.

Rappel : Une boîte de dialogue (javax.swing.JDialog) peut être montrée ou cachée par setVisible (true/false) et doit être détruite après utilisation par dispose ().

  1. La boîte de dialogue opère les contrôles sur les données saisies par l'utilisateur et effectue le traitement, puis elle se détruit elle-même. Cela est envisageable pour des traitements de taille limitée, ou bien s'ils sont d'importance secondaire, ou encore si ce sont des traitements intermédiaires nécessaires à la saisie de la totalité des paramètres (ex: ouverture d'une boîte de dialogue supplémentaire et traitement de ses données).
  2. La boîte de dialogue instancie un objet contenant les données saisies et le transmet à son objet appelant (appelant.setData (objet)) avant de se détruire elle-même. Cette méthode présente plusieurs inconvénients dont les principaux sont qu'un objet supplémentaire est créé inutilement et que l'appelant doit posséder une méthode setData (…).
  3. La destruction de la boîte de dialogue est différée et déléguée à l'appelant. Ce dernier, quand il récupère le flux d'exécution, peut vérifier si l'utilisateur est sorti en validant ou en annulant. En cas de validation, l'appelant peut effectuer le traitement des données en les récupérant directement grâce à des méthodes d'accès dans la boîte de dialogue dont il connaît la référence puisque c'est lui qui l'a créée. Une fois le traitement terminé, il procède lui même à la destruction de la boîte.

Remarque : La classe capsis.kernel.GDialog propose des méthodes facilitant la procédure décrite en 3. En sous-classant cette classe abstraite, on hérite de la méthodes setValidDialog (boolean b) qui permet de déclarer la validation / annulation avant de sortir sur Ok ou Annuler, et de la méthode isValidDialog () qui permet à l'appelant de contrôler la validation.

Remarque : avant de rendre la main, la boîte de dialogue peut s'effacer de l'écran sans se détruire en utilisant le méthode setVisible (false) de Component.

Il est conseillé de préférer les méthodes 3. et 1. dans cet ordre.

Boîtes de dialogue - interception des évènements

Il existe plusieurs variantes pour gérer l'interception des évènements émis par les composants graphiques d'une boîte de dialogue (boutons, listes,etc…). Cette section propose une solution simple et compacte, qui a été utilisée systématiquement pour le développement du pilote interactif gui.

Le principe est que la boîte de dialogue gère les évènements levés par ses composants. Tous les composants pouvant être activés sont déclarés comme des variables d'instances privées de la boîte :

  private JButton browse;

Lors de leur instanciation, leur ActionListener (ou ItemListener… : dépend du type de composant : cf “Au coeur de Java - vol I - Notions fondamentales”, p. 343 et 344) est désigné comme étant la boîte de dialogue elle même :

  browse = new JButton (Translator.swap ("d1.browse")); 
  browse.addActionListener (this);

Enfin, le composant est ajouté dans un JPanel, lui même ajouté dans le contentPane de la boîte de dialogue considérée :

  p2.add (browse); 
  getContentPane ().add (p2, "Center");

La classe décrivant la boîte de dialogue est une sous-classe de javax.swing.JDialog ou de capsis.kernel.GDialog et elle doit implémenter les interfaces correspondant à l'interception des évènements déclenchables par ses composants :

  public class DNewSession extends GDialog implements ActionListener {...}

Enfin, Les méthodes décrites par ces interfaces doivent être implémentées pour traiter les évènements interceptés. Pour cela, on recherche l'objet qui est à la source de l'évènement et on le compare aux composants variables d'instance de la boîte :

public void actionPerformed (ActionEvent evt) {
    if (evt.getSource ().equals (browse)) { 
        browseAction (); 
    } else if (evt.getSource ().equals (ok)) { 
        okAction (); 
    } else if (evt.getSource ().equals (cancel)) { 
        dispose (); 
    } else if (evt.getSource ().equals (help)) { 
        helpAction (); 
    } 
}

Pour un exemple complet, on pourra se référer au code source de la boîte de dialogue “Nouvelle Session” du pilote interactif gui : capsis.gui.DNewSession.

documentation/dialog_box.txt · Last modified: 2021/12/13 09:28 by 127.0.0.1