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

Java Discussion :

Mettre un écouteur sur chaque bouton dans une boucle


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 40
    Points : 41
    Points
    41
    Par défaut Mettre un écouteur sur chaque bouton dans une boucle
    Bonjour à tous.

    Le titre n'étant pas forcément explicite, je vais détailler...

    Voici la partie de mon code qui nous intéresse ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (int i = 0; i < 9; i++) {
            JButton bouton = new JButton("Machin " + (i+1));
    	bouton.setBackground(Color.blue);
    	bouton.setForeground(Color.white);
    	panel.add(bouton);
    }
    Comme vous l'aurez remarqué, ce code me permet de mettre 9 boutons dans un panel.
    J'aimerais mettre un écouteur sur chaque bouton, sachant que chaque bouton amène une action différente.
    Le problème est que si je mets l'écouteur dans la boucle, tous les boutons amènent à la même action, vu qu'ils ont tous le même nom,
    et si je la mets après, il n'y a que le bouton créé en dernier qui contient un écouteur (ce qui est assez logique).
    Donc si quelqu'un pouvait me dire comment faire, je lui en serai très reconnaissant.

    P.S. : (Si c'est possible bien sûr) Je souhaite faire tout ceci avec la boucle... Je sais bien que ce serait beaucoup plus facile (pour moi en tout cas) en créant les boutons un par un ... mais ce serait aussi plus long...

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Je ne comprend pas trop le problème...
    A quoi correspondent ces actions ?


    a++

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 40
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Je ne comprend pas trop le problème...
    A quoi correspondent ces actions ?
    Bonjour et merci de t'intéresser à ma question.

    Ces actions peuvent être n'importe quoi.

    Exemple :
    Je clique sur le bouton n°1, ça affiche un cercle.
    Je clique sur le bouton n°2, ça affiche un carré.
    Je clique sur le bouton n°3, ça affiche un triangle.
    ... etc

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Et avec ceci ? Une seul écouteur pour tout les bouton, mais on détecte quel bouton on a appuyé. Il est possible aussi de mettre autant d'ecouteur que de boutons, mais il faudra faire autrement pour appeler les méthodes que tu veux qui soient executés.

    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
    ActionListener action = new ActionListener(){
    			@Override
    			public void actionPerformed(ActionEvent e)
    			{
    				String buttonname = (((JButton)e.getSource()).getName());
    				if (buttonname.equalsIgnoreCase("Boutton_0"))
    				{
    					System.err.println("bouton 1");
    				}
    				if (buttonname.equalsIgnoreCase("Boutton_1"))
    				{
    					System.err.println("bouton 2");
    				}
    				if (buttonname.equalsIgnoreCase("Boutton_2"))
    				{
    					System.err.println("bouton 3");
    				}
    			}
    		};
     
    		for (int i = 0; i < 3; i++) {
    	        JButton bouton = new JButton("Machin " + (i+1));
    	        bouton.setName("Boutton_"+i);
    	        contentPane.add(bouton);
    	        bouton.addActionListener(action);
    		}
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BillGates62 Voir le message
    Ces actions peuvent être n'importe quoi.
    Ben si c'est des actions différentes, il faudra bien que tu les distingues d'une manière ou d'une autre.
    C'est curieux d'avoir des boutons nommées de la même manière ("Machin 1", "Machin 2", etc.) mais qui ont des actions totalement différentes.



    M'enfin reste que je ne vois toujours pas le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (int i = 0; i < 9; i++) {
            JButton bouton = new JButton("Machin " + (i+1));
    	bouton.setBackground(Color.blue);
    	bouton.setForeground(Color.white);
            bouton.addActionListener(createActionFor(i));
    	panel.add(bouton);
    }
    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public ActionListener createActionFor(int i) {
         switch(i) {
             case 0: return new ActionListener() { ... };
             case 1: return new ActionListener() { ... };
             case 2: return new ActionListener() { ... };
             ....
         }
         throw new IllegalStateException();
    }

    a++

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 40
    Points : 41
    Points
    41
    Par défaut
    Merci à tous les deux.
    Les deux méthodes fonctionnent très bien pour ce que je veux.

    Je sais que ma demande peut paraître "bizarre" mais je débute en Java donc j'expérimente...

    Quoi qu'il en soit, je vous remercie.

  7. #7
    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,

    Une troisième solution serait d'utiliser les commandes (Voir JButton.setActionCommand(), ou faire des Action), genre une commande "CARRE", "CERCLE"... (utiliser des constantes, et un tableau de String pour gérer facilement l'accès dans la boucle) et de faire une seule instance d'ActionListener, et un switch sur la commande.

    Exemple de principe :

    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
    ...
    public final static String COMMAND_CARRE = "CARRE";
    public final static String COMMAND_CERCLE = "CERCLE";
    ...
     
    public final static String[] COMMANDS = {COMMAND_CARRE, COMMAND_CERCLE, ...};
     
    ...
     
    public void methodDeCreation....
     
    ...
     
    ActionListeneter actionListener = createActionListener();
     
    for (int i = 0; i < 9; i++) {
            JButton bouton = new JButton("Machin " + (i+1));
    	bouton.setBackground(Color.blue);
    	bouton.setForeground(Color.white);
            bouton.addActionListener(actionListener);
            bouton.setActionCommand(COMMANDS[i]);
    	panel.add(bouton);
    }
     
    ...
    }
     
    private ActionListener createActionListener() {
     
        return new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				switch (e.getActionCommand()) {
    				case COMMAND_CARRE:
    					...
    					break;
                                    case COMMAND_CERCLE:
                                            ...
                                            break;
    				default:
    					break;
    				}
    			}
    		}
     
    }
    Alternative avec Action :

    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
    public void methodDeCreation....
     
    ...
     
    for (int i = 0; i < 9; i++) {
            JButton bouton = new JButton(new MyAction("Machin " + (i+1),COMMANDS[i]);
    	bouton.setBackground(Color.blue);
    	bouton.setForeground(Color.white);
    	panel.add(bouton);
    }
     
    ...
     
    	private class MyAction extends AbstractAction {
     
    		public MyAction(String name, String command) {
    			super(name);
    			putValue(ACTION_COMMAND_KEY, command);
    		}
     
    		@Override
    		public void actionPerformed(ActionEvent e) { 
    			 switch (e.getActionCommand()) {
    				switch (e.getActionCommand()) {
    				case COMMAND_CARRE:
    					...
    					break;
                                    case COMMAND_CERCLE:
                                            ...
                                            break;
    				default:
    					break;
    				}
    		} 
     
    	}
     
     
    }
    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.

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

Discussions similaires

  1. [XL-2007] Cibler des cellules sur chaque ligne dans une sélection
    Par Ghuron dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/09/2014, 09h59
  2. Réponses: 6
    Dernier message: 08/03/2014, 22h38
  3. Intercepter l'action sur un bouton dans une autre vue
    Par Hira. dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 17/12/2008, 09h51
  4. Cliquer sur un bouton dans une autre application
    Par FredericB dans le forum C++Builder
    Réponses: 16
    Dernier message: 10/05/2008, 17h23
  5. Réponses: 14
    Dernier message: 25/06/2006, 19h18

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