IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Optimisation des ActionListener


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ergonome
    Inscrit en
    Mai 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Mai 2015
    Messages : 34
    Points : 33
    Points
    33
    Par défaut Optimisation des ActionListener
    Bonjour à tous.
    Est-t-il plus optimal de regrouper 3 ActionListener en 1 avec e.getSource() comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Ouvrir implements ActionListener{
    		public void actionPerformed(ActionEvent e) {
    			if(e.getSource()==button1){
    					Frame1 f = new Frame1();
    					f.setVisible(true);
    			}
    			if(e.getSource()==button2){
    				Frame2 g = new Frame2();
    				g.setVisible(true);
    			}
    			if(e.getSource()==button3){
    				Frame3 h = new Frame3();
    				h.setVisible(true);
    			}
    		}
    	}
    Ou est-ce meilleur de faire trois ActionListener différents. (un pour chaque bouton) Ci-dessous l'exemple d'un ActionListener.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Ouvrir1 implements ActionListener{
    		public void actionPerformed(ActionEvent e) {
    			Frame1 f = new Frame1();
    			f.setVisible(true); }
    			}
    La première solution réduit le nombre de lignes du code mais insert des test avec les if(...). Je me demandais donc quel moyen étais le meilleur.
    Merci

  2. #2
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 262
    Points : 634
    Points
    634
    Par défaut
    Salut,
    sans réfléchir moi je te propose la première. Celle-ci est optimale du fait
    qu'elle permet la réduction du nombre de ligne de code et également de centraliser
    les traitements ie avoir une vue générale des traitements.Images que tu avais
    par exemple que tu as juste 20 buttons à gérer !
    Se mettre à créer 20 classes pour chaque boutton serait un peu fastidieux.

    J'apprend à pêcher du poisson comme toi!
    Aujourd'hui apprenant, demain appreneur.
    N'accuse pas le puits d'être trop profond,
    c'est peut-être ta corde qui est trop courte

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je ne vois pas en quoi elle serait plus optimale. Plus optimale en quoi ?
    Simplement, il y a moins d'instances de classe (c'est quoi le problème avec faire plusieurs instances de classe ?), mais on fait 3 tests à chaque fois. Et on fait trois fois la même chose : on peut faire des méthodes aussi. Et la différence du nombre de lignes de code est négligeable pour moi : on a pas des centaines de lignes en moins et on perd en souplesse et modularité. Ici, on fait pas grand chose mais quand on commence à faire plus de choses pour chaque bouton, c'est quand même mieux d'isoler que de centraliser.

    On peut aussi :
    • utiliser une commande si les actions sont de diverses "formes"
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      public void actionPerformed(ActionEvent e) {
         switch( e.getActionCommand() ) {
             ACTION_OPEN: // on a une public static final String ACTION_OPEN = "ACTION_OPEN";
                   // open frame
                   break;
             ACTION_EXIT:
                   // open frame
                   break;
             /* ... */
         }
      }
    • utiliser une classe (interne) qui fait le code en commun
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      public abstract class OpenFrameAction implemenst ActionListener {
          public OpenFrameAction() {
          }
          public void actionPerformed(ActionEvent e) {
                createFrame().setVisible(true);
          }
          protected abstract JFrame createFrame();
      }
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      JButton button = new JButton("frame1");
      button.addActionListener( new OpenFrameAction() {
          protected JFrame createFrame() {
              return new JFrame1();
          }
      })


    Avec Java8 on pourra utiliser un lambda et une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    button1.addActionListener(e-> showFrame(new JFrame1()));
    button2.addActionListener(e-> showFrame(new JFrame2()));
    button3.addActionListener(e-> showFrame(new JFrame3()));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private static void showFrame(JFrame frame) {
        frame.setVisible(true);
    }
    Avec ta classe, on pourrait aussi faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void actionPerformed(ActionEvent e) {
    JFrame frame=null;
    if(e.getSource()==button1){
       frame = new Frame1();
    }
    else if (e.getSource()==button2){
       frame = new Frame2();
    }
    else if(e.getSource()==button3){
        frame = new Frame3();
    }
    if ( frame!=null ) {
       frame.setVisible(true);
    }
    Ce qui avec une commande serait encore plus concis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public void actionPerformed(ActionEvent e) {
    JFrame frame=null;
    switch( e.getActionCommand() ) {
       case FRAME1:
          frame = new Frame1();
          break;
       case FRAME2:
          frame = new Frame2();
          break;
       case FRAME3:
          frame = new Frame3();
          break;
    }
    if ( frame!=null ) {
       frame.setVisible(true);
    }
    Regarde également les Action Swing : lorsqu'on multiplie les boutons (ou menus), il est toujours mieux d'utiliser des actions. C'est beaucoup plus souple. Et la construction du bouton devient plus simple.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ergonome
    Inscrit en
    Mai 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Mai 2015
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup pour les diverses solutions très utiles!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Disques durs] Optimisation des partitions
    Par DarkOcean dans le forum Composants
    Réponses: 18
    Dernier message: 10/02/2005, 13h54
  2. Optimisation des tables
    Par le-roy_a dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 24/01/2005, 10h04
  3. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  4. [Compilateur] Optimisation des conditions
    Par Pedro dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2004, 13h49
  5. Optimisation des requetes
    Par bifidus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/10/2003, 11h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo