Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme actionListener

Sujet résolu
    28 mai 2009 à 14:01:37

    bonjour a tous
    j'ai un soucie......
    je crée des bouton de couleur qui me servent ensuite a changer de couleur des partie de mon IHM.
    donc, pour cela, je crée mes bouton dans une boucle for avec un tableau ce couleur.
    et j'ajoute un actionListener.....

    mais, la le problemes est que seul le dernier bouton crée accede a ma methode actionPerformed...

    donc, je ne voit pas ou est le probleme.

    voici mon code:

    import java.awt.Button;
    import java.awt.Color;
    import java.awt.GridLayout;
    import java.awt.Panel;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    @SuppressWarnings("serial")
    public class ChoixCouleur extends Panel implements ActionListener {
    
    	private Color[] tabCoul = { Color.RED, Color.WHITE, Color.BLACK,
    			Color.yellow, Color.GREEN, Color.CYAN, Color.PINK,
    			Color.LIGHT_GRAY, Color.BLUE };
    
    	private Button bhaut;
    	private Button bbas;
    	private Visu visu2; 
    	
    	public ChoixCouleur(Visu visu, boolean premierPlan) {
    		setBackground(Color.LIGHT_GRAY);
    		setLayout(new GridLayout(3, 3));
    		
    		visu2=visu;
    
    		if (premierPlan) {
    
    			/**
    			 * creer les couleurs des boutons de choix de la couleur du
    			 * premierPlan
    			 */
    			for (int i = 0; i < tabCoul.length; i++) {
    				bhaut = new Button("");
    				bhaut.setBackground(tabCoul[i]);
    				bhaut.addActionListener(this);
    				add(bhaut);
    			}
    		} else {
    
    			/**
    			 * creer les couleurs des boutons de choix de la couleur du
    			 * SecondPlan
    			 */
    			for (int i = 0; i < tabCoul.length; i++) {
    				bbas = new Button("");
    				bbas.setBackground(tabCoul[i]);
    				bbas.addActionListener(this);
    				
    				add(bbas);
    			}
    		}
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		
    		if (e.getSource()==bhaut) {
    			System.out.println("ici");
                     /**
                      * seul mon dernier bouton rentre ici 
                      *lorsque je clique dessus....
                      *
                     **/
    			visu2.setBackground(bhaut.getBackground());
    
    		} else {
    			// de meme ici
    		}
    	}
    
    }
    



    merci de votre aide ;)
    • Partager sur Facebook
    • Partager sur Twitter
    Le jour où Microsoft fera des choses qui ne plantent pas, ça sera des clous ...
      28 mai 2009 à 14:16:13

      J'ai déjà vu ce problème y'a quelques jours.
      En fait je pense que le soucis vient du getSource() parce que comme tu écrases les anciennes références des JButtons, seule reste la dernière.

      Et une solution est la suivante :
      for (int i = 0 ; i < tabCoul.length ; i++) {
         final Button bhaut = new Button("");
         bhaut.setBackground(tabCoul[i]);
         bhaut.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("ici");
                visu2.setBackground(bhaut.getBackground());
            }
         });
         add(bhaut);
      }
      


      [EDIT]
      J'ai modifié le code entre temps, on évite les if(e.getSource() ) machin parce que c'est pas très objet comme façon de procéder...
      • Partager sur Facebook
      • Partager sur Twitter
        28 mai 2009 à 14:28:36

        Si tu connais le nombre de Jbutton tu peux peut être faire un tableau de jbutton
        JButton[] tableauBoutton = new JButton[30] ;
        
        for (int i = 0; i < tabCoul.length; i++) {
        				
        				     tableauBoutton[i].setBackground(tabCoul[i]);
        				tableauBoutton[i].addActionListener(this);
        				add(tableauBoutton[i]);
        			}
        


        Perso j'ai utilisé sa il n'y a pas longtemps et tout mes boutons fonctionnent ;)
        • Partager sur Facebook
        • Partager sur Twitter
          28 mai 2009 à 14:31:25

          elmh, ta methode ne fonctionne pas, des que je clique sur un bouton, la derniere couleur du bouton est appliqué.....

          je test ton code bkhenaton ;)

          edit: il plante a l'execution sur la ligne
          tableauBoutton[i].setBackground(tabCoul[i]);

          je ne voit pas pourquoi (en passant j'ai 9 boutons)
          • Partager sur Facebook
          • Partager sur Twitter
          Le jour où Microsoft fera des choses qui ne plantent pas, ça sera des clous ...
            28 mai 2009 à 14:35:52

            salut
            tu peux faire
            for (int i = 0 ; i < tabCoul.length ; i++) {
               final Color coul = tabCoul[i];
               bhaut = new Button("");
               bhaut.setBackground(coul);
               bhaut.addActionListener(new ActionListener() {
                  public void actionPerformed(ActionEvent e) {
                      System.out.println("ici");
                      visu2.setBackground(coul);
                  }
               });
               add(bhaut);
            }
            


            sans oublier le "final" a visu2


            EDIT: ton exception viens du fait que tu n'a pas initialisé tes boutons

            sinon si tu peux faire
            for (int i = 0 ; i < tabCoul.length ; i++) {
               final Bouton bhaut = new Button("");
               bhaut.setBackground(tabCoul[i]);
               bhaut.addActionListener(new ActionListener() {
                  public void actionPerformed(ActionEvent e) {
                      System.out.println("ici");
                      visu2.setBackground(bhaut.getBackground());
                  }
               });
               add(bhaut);
            }
            
            • Partager sur Facebook
            • Partager sur Twitter
              28 mai 2009 à 14:42:26

              nickel, sa marche quarante-sept, je le modif un peut pour le rendre plus claire pour moi ;)

              je vous remercie tous ;)
              • Partager sur Facebook
              • Partager sur Twitter
              Le jour où Microsoft fera des choses qui ne plantent pas, ça sera des clous ...
                28 mai 2009 à 14:52:50

                de rien

                en fait l'erreur de elmh, c'est qu'une classe anomyme ne copie pas les valeurs des propriétés de sa classe englobante, mais leur référence.

                utiliser une variable locale finale permet de certifier que la valeur spécifiée à la classe anonyme est constante
                • Partager sur Facebook
                • Partager sur Twitter
                  28 mai 2009 à 15:21:00

                  Euh oui tu peux aussi déclarer un tableau de type final et l'initialisé dans la classe anonyme, mois c'est comme ça que je fais.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  probleme actionListener

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown