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 :

boutons, MouseListener et iterations


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut boutons, MouseListener et iterations
    Bonjour

    J'ai un souci avec une sorte de browser que j'ai créé.

    Je créé un certain nombre de JButton dans une boucle. Je veux pouvoir afficher un texte (different pour chaque bouton) dans un label lorsque je passe sur le bouton en question. Tous les boutons sont ensuite regroupés dans un JPanel.

    Mon probleme est que lorsque je deplace la souris sur l'un des boutons, il me renvoie toujours la valeur relative au dernier bouton, à savoir "4" !!

    Ma question est : comment lier le MouseEntered à chacun de mes boutons ?

    voici le code :
    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
     
    private String[] Texte={"OK","CANCEL","MENU","NEXT","BACK"};
    private JPanel Panel=nexwJPanel();
    private int i;
     
    for (i=0;i<4;i++){
     
    	JButton bouton=new JButton(Texte[i]);
    	bouton.addMouseListener(new MyMouseListener());
    	Panel.add(bouton);	
    }
    private class MonMouseListener implements MouseListener{
       public void mouseEntered(MouseEvent arg0) {
           System.out.println(i);
    }

    Merci par avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Tu affiches dans le listener l'attribut i de l'outerclass (qui est la meme pour tous les button). A la fin de la boucle, i vaut 4, tu affiches donc 4 systematiquement.

    Pour resoudre ton probleme :
    - soit tu recuperes le button a partir de l'evenement. A partir du button, tu as les infos specificiques (comme le nom du button).
    - soit tu fais un listener par button (comme tu l'as fait), mais qui a un attribut supplementaire contenant par exemple le texte à afficher.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut
    En realite, j'ai simplifié le probleme ici puisque je ne sais, a priori, pas combien je peux avoir de boutons et chaque bouton ne contient pas un Texte mais une image ....

    La 1ere solution que tu m'apportes me semble la meilleure mais je ne vois pas comment faire ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Ben ...

    Citation Envoyé par javadoc MouseEvent
    public Component getComponent()
    Returns the originator of the event.
    Returns:
    the Component object that originated the event, or null if the object is not a Component.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut
    Ok merci Sanguko

    Le GetComponent du Mouselistener marche si je donne un nom à mes boutons, du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton.setName(String.valueOf(indexBut));
    Il me renvoie bien la valeur du bouton correspondant quand je clique sur le bouton (cf le code ci-dessous):

    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
     
    private String[] Texte={"OK","CANCEL","MENU","NEXT","BACK"};
    private JPanel Panel=nexwJPanel();
    private int i;
     
    for (i=0;i<4;i++){
     
    	JButton bouton=new JButton(Texte[i]);
            bouton.setName(String.valueOf(indexBut));
    	bouton.addMouseListener(new MyMouseListener());
    	Panel.add(bouton);	
    }
    private class MonMouseListener implements MouseListener{
       public void mouseEntered(MouseEvent arg0) {
           System.out.println(arg0.getComponent().getName());
    }
    Le souci, c'est qu'en voulant trop simplifier mon pb, j'en ai perdu les elements clefs qui composent ma classe.

    En fait, j'ai une liste de fiche (classes qui contiennent un certain nombre de parametres) et c'est l'image de chacune des fiches que je fais apparaitre dans ma boucle (et non le Texte[i] comme je l'avais noté dans ma vesrion simplifiée ).
    Dans ma boucle "for i", si je demande d'afficher l'etat de chaque fiche (dont l'indice correspond au nouveau bouton instancié), c'est OK.
    En revanche, si je lui demande de m'afficher l'etat de la fiche au moment de l'evenement (MouseClicked), maliste.get(index).getetat() me renvoie "null" ...

    Ou est l'erreur ?? (pourtant ma liste est en entree de mon constructeur Visionneuse)



    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
     
    private List<Fiche> maliste;
     
     Visionneuse(List<FicheCD> maliste){
     
    for (int i=0;i<maliste.size();i++){
    PathImage="./IMAGES/"+maliste.get(i).getnomimagette();
    System.out.println(maliste.get(i).getetat()); // sortie de la variable etat --> OK
    JButton bouton=new JButton(new ImageIcon(PathImage));
    bouton.setName(String.valueOf(indexBut));
     
    bouton.addMouseListener(new MonMouseListener());		
    Panel.add(bouton);
     
    }
    }
     
    private class MonMouseListener implements MouseListener{
    		public void mouseClicked(MouseEvent Mevt){
     
                      MonIndexChoix=Mevt.getComponent().getName(); // Valeur OK
    		  System.out.println(maliste.get(MonIndexChoix).getetat()); // VALEUR null !!
    }

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    C'est un peu dur de t'aider, parce que le code que tu montres contient pas mal d'erreur de compilation.
    J'imagine que indexBut, c'est i en fait, et que tu reconvertis la String retournée par getName() en int ?

  7. #7
    Membre averti Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Points : 345
    Points
    345
    Par défaut
    Pourquoi ne pas créer une List/ArrayList de JButton à taille variable?
    L'idée est d'ensuite associer à chaque ajout d'éléments un MouseEntered à ton JButton

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut
    Oui, pardon sanguko

    la variable indexBut, c'est la meme que le "i". Il fallait bien lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton.setName(String.valueOf(i));
    Je le transforme en type String, pour ensuite l'utiliser dans le MouseListener sous forme d'indice (donc integer) puisque je repere mes elements de ma liste avec les indices.

    Quel moyen simple j'ai pour recuperer les informations de ma liste depuis mon MouseClicked ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut
    J'essaierai demain rems033.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut
    Bonjour

    Bon, je n'y arrive pas.
    Ci-joint le code dans sa totalité.

    Je n'arrive pas a comprendre pourquoi ma liste est vide au moment de l'Action !!
    probleme de declarations ?

    Rappel : Liste<FicheCD> est une liste de fiches que je passe en argument lors de l'appel a ma visionneuse. Chaque fiche contient des elements (etat, nom de l'imagette etc...) que j'aimerais afficher dans cette classe. Les imagettes sont bien affichées. L'appel a la methode addActionListener sur chacun des boutons generes implique que ma miste est vide ("null") dans actionperformed ?!
    J'ai essayé les liste de boutons mais j'ai l'impression que le probleme est le meme. Une fois ma liste créée, comment associer a chaque bouton un Event qui prenne en compte ma liste ?

    Merci pour votre aide !! Je suis coincé !


    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
     
    import javax.swing.*;
     
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.text.NumberFormat;
    import java.util.ArrayList;
    import java.util.List;
     
     
    public class Visionneuse {
     
    private JButton ButMENU=new JButton("RETOUR MENU");
    private JButton ButSTOP=new JButton("STOP");
     
    private List<FicheCD> maliste; // est ce utile ??
    private int indexBut;
    private int MonIndexChoix;
    //private List ListButton= new ArrayList();
    private JButton bouton=new JButton();
     
    Visionneuse(List<FicheCD> maliste){
     
    int NombreImagette=maliste.size();
    PanImagette.setLayout(new GridLayout((int)NombreImagette/5,5));
    try{
    	for (indexBut=0;indexBut<NombreImagette;indexBut++){
    	PathImage="./IMAGETTES/"+maliste.get(indexBut).getnomimagette();
     
    	// Redimensionne les icones
    	System.out.println(maliste.get(indexBut).getetat()); // ici, l'etat est bien celui attendu
    	ImageIcon ImIcon=new ImageIcon(PathImage);
    	Image MonPetitIcone = ImIcon.getImage().getScaledInstance(40, 40, Image.SCALE_DEFAULT);
    	bouton=new JButton(new ImageIcon(MonPetitIcone));
    	bouton.setName(String.valueOf(indexBut));
     
     
    	//ListButton.add(indexBut,bouton);
    	System.out.println("ma liste = "+maliste.get(indexBut).getnomimagette());
    	bouton.addActionListener(new MonActionBouton());
    	PanImagette.add(bouton);
     
        }
      } catch (Exception e){System.out.println(e.getMessage());}
     
    private class MonActionBouton implements ActionListener{
    	public void actionPerformed(ActionEvent evt) {
    	if (evt.getSource()==ButSTOP){
    			System.exit(1);
    	} else if (evt.getSource()==ButMENU){
    		MaFrame.setVisible(false);	
    	} else {
    		System.out.println(evt.getSource());
    		System.out.println("Bouton Name = "+bouton.getName());
    		System.out.println("ETAT DE LA FICHE : "+maliste);
     
    		}
    	}
        } 
     
    }

  11. #11
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Normal, à aucun moment tu n'affectes ton attribut de classe maListe.

    Rajoutes ceci au début de ton constructeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.maListe = maListe;

    Ca ira tout de suite mieux
    ++
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut
    SUPER sinok !!

    Tu me sauves !! (j'avais trouvé une autre solution en integrant une classe abstraite mais ca commencait a devenir compliqué).
    Ta solution est nickel, et on ne peut plus simple.

    Merci encore !!!!

Discussions similaires

  1. Problème d'ecouteur sur un bouton(MouseListener)
    Par titi42 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 30/09/2009, 17h24
  2. Pop-up d'une dialog box a partir d'un bouton
    Par bobbyjack dans le forum MFC
    Réponses: 21
    Dernier message: 13/09/2005, 15h32
  3. Réponses: 2
    Dernier message: 31/08/2002, 14h00
  4. Bmp pour boutons
    Par Fizgig dans le forum Outils
    Réponses: 5
    Dernier message: 22/08/2002, 10h56
  5. Afficher/Masquer un bouton comme IE 6
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/07/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