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

Composants Java Discussion :

listener qui n'écoute pas


Sujet :

Composants Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut listener qui n'écoute pas
    Bonjour,

    je débute en Swing et je m'exerce en faisant des listener pour changer la couleur de mon "panel". Je crois avoir fait tout ce qu'il fallait: implementer l'interface ActionListener, définir la méthode actionPerformed, ajouter les listeners aux boutons... je ne sais pas ce qui manque. En fait quand on clique sur les boutons, ça ne fait rien du tout.
    Voici le code et merci.
    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
     
    package Frames;
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
     
    class Model extends JFrame implements ActionListener{
     
        public Model(){
     
            setTitle("REMPLISSAGE DE DONNEES");
            setSize(350,200);
            setLocationRelativeTo(null);
            setResizable(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            init();
     
        }
     
        public void init() {
     
           JPanel titres = new JPanel(new GridLayout(3,1));
           JLabel nom = new JLabel("Nom");
           titres.add(nom);
           JLabel prenom = new JLabel("Prénom");
           titres.add(prenom);
           JLabel adresse = new JLabel("Adresse");
           titres.add(adresse);
     
           JTextArea message = new JTextArea();
     
           JPanel saisie = new JPanel(new GridLayout(3,1));
           JTextField saisirNom = new JTextField(10);
           saisie.add(saisirNom);
           JTextField saisirPrenom = new JTextField(10);
           saisie.add(saisirPrenom);
           JTextField saisirAdresse = new JTextField(10);
           saisie.add(saisirAdresse);
     
           JPanel panelBoutons = new JPanel(new FlowLayout());
           JButton bvalider = new JButton("JAUNE");
           panelBoutons.add(bvalider);
           JButton bannuler = new JButton("ROUGE");
           panelBoutons.add(bannuler);
     
           bannuler.addActionListener(this);
           bvalider.addActionListener(this);
     
           getContentPane().setLayout(new BorderLayout(10,10));
           getContentPane().add(message, BorderLayout.NORTH);
           getContentPane().add(titres, BorderLayout.WEST);
           getContentPane().add(saisie, BorderLayout.CENTER);
           getContentPane().add(panelBoutons, BorderLayout.SOUTH);
     
        }
     
        private JButton valider;
        private JButton annuler;
     
       public void actionPerformed(ActionEvent e){
           Object source = e.getSource();
           Color color = getBackground();
           if(source == valider) color = Color.yellow;    
           else if (source == annuler) color = Color.red;
           setBackground(color);
           repaint();
       }
     
    }

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Par défaut
    Deja, je n'aurais pas fais ce genre de test :
    En cours du moins, on nous l'as fortement deconseiller. utiliser plutot les methodes de Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(source.equals(valider))
    Ensuite, tu cherche a savoir si ton bouton enfoncer est "valider", alors que tu ajoute sur ta fenetre "bvalider".
    Normal dans ce cas que ton Listener ne fasse rien.

  3. #3
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    Bonjour,

    la condition "source == annuler" n'est jamais vérifiée car annuler reste à null

    il faut remplacer "JButton bvalider = new JButton("JAUNE");" par "valider = new JButton("JAUNE");" et idem pour annuler

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Merci beaucoup pour ta réponse NainzguL. J'ai corrigé le code, que voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    JPanel panelBoutons = new JPanel(new FlowLayout());
           JButton jaune = new JButton("JAUNE");
           panelBoutons.add(jaune);
           JButton rouge = new JButton("ROUGE");
           panelBoutons.add(rouge);
     
           jaune.addActionListener(this);
           rouge.addActionListener(this);
    Cependant NetBeans me conseille fortement de renommer rouge et jaune.
    Par ailleurs, si j'enlève ces lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private JButton jaune;
        private JButton rouge;
    il m'affiche un problème au niveau de la méthode actionPerformed()
    Des idées?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Citation Envoyé par fnobb Voir le message
    Bonjour,

    la condition "source == annuler" n'est jamais vérifiée car annuler reste à null

    il faut remplacer "JButton bvalider = new JButton("JAUNE");" par "valider = new JButton("JAUNE");" et idem pour annuler
    merci fnobb, j'ai corrigé aussi ce que tu m'as proposé.
    Avantage: il ne me demande plus de renomer jaune et rouge.
    Inconvenient: ça ne marche toujours pas

  6. #6
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Bonjour, en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private JButton jaune;
    [...]
    JButton jaune = new JButton("JAUNE");
    Tu utilises 2 fois le même nom pour 2 variables différentes, sauf que pour appeler la 1ère il faudra faire this.jaune
    C'est pour cela qu'il est conseillé de ne pas faire de doublon, pour éviter la confusion.

    Il faut simplement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private JButton jaune;
    [...]
    jaune = new JButton("JAUNE");

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    C'est déjà fait, merci morph41, mais ça n'arrange pas le problème

  8. #8
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Suite à toutes les modifications, pourrais-tu reposter le code complet?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Citation Envoyé par morph41 Voir le message
    Suite à toutes les modifications, pourrais-tu reposter le code complet?
    Bien sûr, le voilà:

    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
     
    package Frames;
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
     
    class Model extends JFrame implements ActionListener{
     
        public Model(){
     
            setTitle("REMPLISSAGE");
            setSize(350,200);
            setLocationRelativeTo(null);
            setResizable(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            init();
     
        }
     
        public void init() {
     
           JPanel titres = new JPanel(new GridLayout(3,1));
           JLabel nom = new JLabel("Nom");
           titres.add(nom);
           JLabel prenom = new JLabel("Prénom");
           titres.add(prenom);
           JLabel adresse = new JLabel("Adresse");
           titres.add(adresse);
     
           JTextArea message = new JTextArea();
     
           JPanel saisie = new JPanel(new GridLayout(3,1));
           JTextField saisirNom = new JTextField(10);
           saisie.add(saisirNom);
           JTextField saisirPrenom = new JTextField(10);
           saisie.add(saisirPrenom);
           JTextField saisirAdresse = new JTextField(10);
           saisie.add(saisirAdresse);
     
           JPanel panelBoutons = new JPanel(new FlowLayout());
           jaune = new JButton("JAUNE");
           panelBoutons.add(valider);
           rouge = new JButton("ROUGE");
           panelBoutons.add(annuler);
     
           jaune.addActionListener(this);
           rouge.addActionListener(this);
     
     
           getContentPane().setLayout(new BorderLayout(10,10));
           getContentPane().add(message, BorderLayout.NORTH);
           getContentPane().add(titres, BorderLayout.WEST);
           getContentPane().add(saisie, BorderLayout.CENTER);
           getContentPane().add(panelBoutons, BorderLayout.SOUTH);
     
        }
     
     
     
           public void actionPerformed(ActionEvent e){
     
               Object source = e.getSource();
               Color color = getBackground();
               if (source.equals(jaune)) color = Color.yelow;
               else if (source.equals(rouge)) color = Color.red;
               setBackground(color);
               repaint();
     
     
           private JButton jaune;
           private JButton rouge;

    Remarque: je vois dans la doc trouvée sur le net très souvent "if (source == jaune)"

  10. #10
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Il y a plusieurs erreurs, ce code ne compile pas, pourquoi ne pas lire les messages d'erreur du compilateur?

    Tu as laissé valider et annuler alors qu'ils ont été renommés en jaune et rouge.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    jaune = new JButton("JAUNE");
    panelBoutons.add(jaune);
    rouge = new JButton("ROUGE");
    panelBoutons.add(rouge);
    Il manque des accolades (peut-être une erreur de copier/collé dans le forum).

    L'écoute fonctionne, c'est simplement que tu changes la couleur de fond de la JFrame, or son fond n'est pas visible, on voit seulement le fond des JPanels qu'elle contient (ils sont par-dessus). En faisant ceci, ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public void actionPerformed(ActionEvent e) {
            Object source = e.getSource();
            if (source == jaune)
                jaune.setBackground(Color.yellow);
            else if (source == rouge)
                rouge.setBackground(Color.red);
        }
    Le == fonctionne car les variables pointent sur le même espace mémoire, mais parfois cet opérateur est utilisé à mauvais escient, alors que la méthode equals() est beaucoup moins ambigüe, c'est pour cela qu'il est conseillé de l'utiliser.

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Par défaut
    Ce que je trouve etrange, c'est cette derniere partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
           public void actionPerformed(ActionEvent e){
     
               Object source = e.getSource();
               Color color = getBackground();
               if (source.equals(jaune)) color = Color.yelow;
               else if (source.equals(rouge)) color = Color.red;
               setBackground(color);
               repaint();
     
     
           private JButton jaune;
           private JButton rouge;
    Ne manque-t-il pas une accolade ? Et, pourquoi declares-tu tes variables a la fin, et non avant toute chose ? Ca n'a peut etre rien a voir, mais, Eclipse te dirais qu'il ne trouve pas tes variables si elles sont placees a la fin.

    Pour ce qui est du source == jaune, je me contente simplement de repeter ce que j'ai appris en DUT (et ce pourquoi on se faisait tirer des points....).

  12. #12
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Citation Envoyé par NainzguL Voir le message
    Et, pourquoi declares-tu tes variables a la fin, et non avant toute chose ? Ca n'a peut etre rien a voir, mais, Eclipse te dirais qu'il ne trouve pas tes variables si elles sont placees a la fin.
    Non pas du tout, ce sont des attributs de la classe, ils sont chargés au chargement de la classe, avant tout appel des méthodes, on peut très bien les déclarer entre 2 méthodes. Si on les mets en général en début ou fin de classe, ce n'est qu'une question de clarté.

  13. #13
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Par défaut
    ah, d'accord, au temps pour moi. Merci pour cette precision Morph41.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Merci beaucoup pour toutes ces précisions. Le problème est réglé (pour les accolades, c'était un pb de copier-coller)

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Rebonjour,

    je ne voudrais pas être lourd, mais voici ce qui se passe maintenant.
    Suite aux suggestions données sur le forum, et après vérification que cela marchait, j'ai essayé une autre chose:
    - on clique sur le bouton "valider" et le message "Bienvenue" est affiché dans le JTextArea
    - on clique sur le bouton "Annuler" et "Au revoir" s'affiche au même endroit.

    J'ai fait une classe interne et ça marchait. Ensuite j'ai copié le code de la classe interne sur une autre classe, mais toujors dans le même package (avec tous les imports nécessaires et rendant la classe public) Aucune erreur était signalée au niveau du code, la fenêtre s'affichait mais aucune réaction lorsqu'on appuyait sur les boutons. Je reviens sur le code premier, une classe public avec une classe interne, et OH, surprise! cela ne marche pas non plus.
    J'ai refait les imports, j'ai revu le code, j'ai même relancé NetBeans au cas où... rien n'y fait. Et je ne comprends pas où est le problème.
    Je poste 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
    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
     
    package Frames;
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
     
    public class Model extends JFrame {
     
        public Model(){
     
            setTitle("REMPLISSAGE DE DONNEES");
            setSize(350,200);
            setLocationRelativeTo(null);
            setResizable(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            init();
     
        }
     
        public void init() {
     
           JPanel titres = new JPanel(new GridLayout(3,1));
           JLabel nom = new JLabel("Nom");
           titres.add(nom);
           JLabel prenom = new JLabel("Prénom");
           titres.add(prenom);
           JLabel adresse = new JLabel("Adresse");
           titres.add(adresse);
     
           JTextArea message = new JTextArea();
     
           JPanel saisie = new JPanel(new GridLayout(3,1));
           JTextField saisirNom = new JTextField(10);
           saisie.add(saisirNom);
           JTextField saisirPrenom = new JTextField(10);
           saisie.add(saisirPrenom);
           JTextField saisirAdresse = new JTextField(10);
           saisie.add(saisirAdresse);
     
           JPanel panelBoutons = new JPanel(new FlowLayout());
           JButton valider = new JButton("VALIDER");
           panelBoutons.add(valider);
           JButton annuler = new JButton("ANNULER");
           panelBoutons.add(annuler);
     
           valider.addActionListener(new ClicListener(message));
           annuler.addActionListener(new ClicListener(message));
     
     
           getContentPane().setLayout(new BorderLayout(10,10));
           getContentPane().add(message, BorderLayout.NORTH);
           getContentPane().add(titres, BorderLayout.WEST);
           getContentPane().add(saisie, BorderLayout.CENTER);
           getContentPane().add(panelBoutons, BorderLayout.SOUTH);
     
        } 
     
       class ClicListener implements ActionListener{
     
           JTextArea cible;
           JButton vali;
           JButton annu;
     
           public ClicListener(JTextArea cible)
           {
               this.cible=cible;
           }
     
           public void actionPerformed(ActionEvent e){
               Object source = (JButton)e.getSource();
               if (source.equals(vali)) cible.append("Bienvenue");
               else if (source.equals(annu)) cible.append("Au revoir");
     
        }
    }
    }
    Merci de votre aide.

  16. #16
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Rebonjour, tu as refait la même erreur.
    Que valent vali et annu dans ClicListener ? null

    Si un code fonctionne à un moment et que quand tu le réessaie il ne fonctionne plus, c'est qu'il a changé

    Tu as redéclaré tes boutons en variables locales à init()

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Citation Envoyé par morph41 Voir le message
    Rebonjour, tu as refait la même erreur.
    Que valent vali et annu dans ClicListener ? null

    Si un code fonctionne à un moment et que quand tu le réessaie il ne fonctionne plus, c'est qu'il a changé

    Tu as redéclaré tes boutons en variables locales à init()
    Bon, j'ai beau retourner mes variables dans tous les sens, je suis toujours coincé, mais je trouverai.
    Merci beaucoup morph41 pour la piste.

  18. #18
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2006
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 389
    Par défaut
    ta essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if(source == bvalider) color = Color.yellow;    
           else if (source == bannuler) color = Color.red;
    A+

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Cette fois c'est bon, ouf!

    Merci à tous de votre aide, en particulier morph41 qui a pris le temps de répondre à mes questions


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

Discussions similaires

  1. Action Listener qui ne fonctionne pas
    Par pinps dans le forum Débuter avec Java
    Réponses: 36
    Dernier message: 21/11/2013, 17h09
  2. Réponses: 1
    Dernier message: 10/09/2008, 11h22
  3. addEventistener qui écoute pas mon click :(
    Par kimo0n dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 02/05/2008, 18h33
  4. Key Listener qui passe pas
    Par FCDB dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 09/04/2007, 21h31
  5. Réponses: 3
    Dernier message: 20/11/2006, 09h45

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