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 :

Rapide ou lourd : actionListener


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut Rapide ou lourd : actionListener
    Bnojour , je me demande si il est préférable de declarer un actionListener par bouton ou un pour tous avec des if ?

    merci

    [ Sujet déplacé depuis le forum java par Viena ]
    Les Règles du Forum

  2. #2
    Membre éprouvé Avatar de Oui-Oui MB
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Par défaut
    Ca dépend... Si tu as 2 ou 3 boutons, un même actionListener s'en sort bien mais si tu as 50 boutons, vaut mieux faire des groupes d'actionListener...

    Sinon, tu peux aussi faire des méthodes qui porte le nom de performXXX ou XXXExecute où XXX correspond au nom du bouton. Ainsi, dans ton actionListener, tu récupères le nom du bouton et par la réflexivité, tu appelles la méthode qu'il faut.

  3. #3
    Membre confirmé Avatar de Mathieu.Nanoux
    Étudiant
    Inscrit en
    Février 2004
    Messages
    166
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 166
    Par défaut
    moi, je ferai un par bouton.

    1. C'est plus facile pour s'y retrouver après dans le code.
    2. Je pense que l'instruction if est plus lourd que si tu appelle directement la métode actionListener correspondant au bouton.

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Je dirais que ca dépend de ce que fait le bouton.
    Si il doit interagir avec 10 sous composants et 20 sous sous composants, ca va etre lourd de faire un actionlistener par bouton (références croisées, à mettre à jour, ...). Alors qu'un seul actionlistener dans le conteneur général suffit.

    Ca dépend surtout de ton style de programmation. Je te conseille ma méthode habituelle, et je pense que lemccain aussi.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Oui-Oui MB: concernant les performances, tu ne pourras jamais égaler des suites de "if" en utilisant la réflexivité, c'est beaucoup trop coûteux

  6. #6
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 28
    Par défaut
    tu peux utiliser aussi des interfaces javax.swing.Action moi je trouve ça plus joli

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    J'ai environ 20 boutons.

    Mais je m'mmele les pinceaux avec sans utilisé de if dans un actionlistener.

    Regargez plutôt :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JPanel;
     
     
     
    public class Legende extends JPanel implements ActionListener{
     
    	String name;
    	Plan plan;
    	JButton[] label;
     
    	public Legende(int largeur, int hauteur, Plan plan)
    	{	
    		this.plan=plan;
     
    		this.setBorder(BorderFactory.createLineBorder(Color.black,2));
    		this.setLayout(null);
     
    		JButton b1 = new JButton("ALARMES");
    		JButton b2 = new JButton("SORTIE");
    		JButton b3 = new JButton("AGRANDIR");
     
    		label = new JButton[19];
    		label[0]=new JButton("Siège SGSF");
    		label[1]=new JButton("Locaux divers");
    		label[2]=new JButton("Latéraux");
    		label[3]=new JButton("SAP");
    		label[4]=new JButton("MCV1000");
    		label[5]=new JButton("Lunettes chauffantes");
    		label[6]=new JButton("CDI Sud");
    		label[7]=new JButton("Zone K");
    		label[8]=new JButton("Bureaux auto");
    		label[9]=new  JButton("Achats SGGF");
    		label[10]=new JButton("Stock auto");
    		label[11]=new JButton("Feuilleté");
    		label[12]=new JButton("Magasin Verre");
    		label[13]=new JButton("MCV2000 & 3000");
    		label[14]=new JButton("Embalage");
    		label[15]=new JButton("Découpe travers");
    		label[16]=new JButton("Equarri");
    		label[17]=new JButton("Float");
    		label[18]=new JButton("Four");
     
    		for(int i=0;i<19;i++)
    		{
    			label[i].setBounds(10,400+15*i,200,20);
    			this.add(label[i]);
    			label[i].addActionListener(this);
     
    		}	
     
    		b1.setBounds(1,1,200,50);
    		b2.setBounds(1,50,200,50);
    		b3.setBounds(1,200,200,50);
     
    		this.add(b1);
    		this.add(b2);
    		this.add(b3);
     
    		b1.addActionListener(this);
    		b2.addActionListener(this);
    		b3.addActionListener(this);
     
    	}
     
     
    		public void actionPerformed(ActionEvent e)
    		{
    			int bouton = e.getID();
    			System.out.println(bouton);
    		}
     
     
    		public void actionPerformedb1(ActionEvent e) {
    			String type = e.getActionCommand(); //retourne la valeur du boutton		
    			plan.Afficher_alarmes();
    			plan.repaint();
    		}
     
    		public void actionPerformedb2(ActionEvent e) {
    			System.exit(0);
    		}
     
    		public void actionPerformedb3(ActionEvent e) {
    			String type = e.getActionCommand(); //retourne la valeur du boutton		
    			//methode
    			plan.repaint();
    		}
     
     
     
    }
    20 boutons, est-ce enorme avec des if ? si ca passe , je voudrai bien quand meme que l'on me montre un code avec plusieurs boutons et un actionlistener sur chacun ...

  8. #8
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    class Toto extends JFrame implements ActionListener{
      ...
      private JButton getButton1(){
        if(button1==null){
          button1 = new JButton("OK");
          button1.addActionListener(this);
        }
     
        return button1;
      }
     
      private JButton getButton2(){
        if(button2==null){
          button2 = new JButton("Cancel");
          button2.addActionListener(this);
        }
     
        return button2;
      }
     
      ...
     
      public void actionPerformed(ActionEvent ae){
        Object source = ae.getSource();
     
        if (source == getButton1()) {
          ...
        } else if (source == getButton2()) {
          ...
        } else {
          ...
        }
      }
    }

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Par défaut
    La question de rapidité n'est pas trop à prendre en compte.

    L'interet est plus architectural. Imagine une façade de bouton pour une lecteur de cassette de voiture. La facade peut etre retirer, voir modifiée facilement, car une broche relie l'IHM au controleur.

    De faire venir tout tes évènements sur un meme goulot te permet un meilleur controle, et un meilleur découplage.

    Par exemple tu peux vouloir modifier l'état de certains boutons si on clique sur qq chose (à l'exemple: quand tu fais éjecte, le bouton play remonte).

    A partir de ce goulot tu peux rediriger vers des commandes. Le code est plus maintenable.

    Java permet d'associer une commande (action), c'est le pattern commande, à des objets graphiques. Personellement je n'aime pas.

    Bonne continuation.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    MErci pour ces explications les mecs !

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Par défaut
    Pour completer ce que dit Alec6,

    c'est une question de besoin et de style de programmation.
    Le design Pattern Command permet (comme presque ts les design patterns) de decouper un code lourd en plusieurs bouts de code plus legers, de plus l'extensibilité est plus commode (rajout de commande a chaque fois).

    En ce qui concerne le "tout factoriser dans un code", il a les avantages precedemment cités, mais il ne faut pas tomber dans l'anti patron "objet divin" (celui qui fait tout).

    Donc il faut voir en fonction des besoins.

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

Discussions similaires

  1. Calcul rapide de percentiles
    Par benj63 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 08/12/2006, 14h50
  2. LES TECHNIQUES DES SGBDR / MySQL rapide ???
    Par SQLpro dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/09/2003, 11h16
  3. [VBA Excel] Effacer rapidement une feuille
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2002, 13h12

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