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 :

Probleme avec actionPerformed dans JPopupMenu


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut Probleme avec actionPerformed dans JPopupMenu
    Bonjour,

    voilà une chose bien inquiétante, dans l'application que je développe, il y a donc un JPanel (reagissant au DnD) et on peut droper dedans des objets (Materiel) qui sont en fait des JPanel aussi.
    OnClick sur un Materiel, un JPopupMenu apparait et propose de 'delete' le Materiel.

    Jusqu' ici tout va bien.

    Mais onClick sur l'item delete, rien ne se passe ... Pourtant le code est bon ...

    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 void creerPopup() {
            monPopup = new JPopupMenu ();
            liaison = new JMenu("liaison to");
            delete = new JMenuItem ("delete");
            delete.addActionListener (new ActionListener () {
                public void actionPerformed (ActionEvent e) {
                    afficheDialogue();
               }
            });
            proprietes = new JMenuItem ("properties");
            monPopup.add(liaison);
            monPopup.add(delete);
            monPopup.add(proprietes);
        }
    Donc voilà, onClick le JPopupMenu apparait bien mais le actionPerformed ne fait rien (il ne rentre jamais dedans en fait).

    J'ai trouvé une parade (laide), a savoir :
    Faire en sorte que ma classe implements ActionListener,
    puis remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    delete.addActionListener (new ActionListener () {
                public void actionPerformed (ActionEvent e) {
                    afficheDialogue();
               }
            });
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete.addActionListener (this);
    Et ensuite ajouter la methode dans la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().compareTo("delete")==0) {
                afficheDialogue();   
            }
        }
    C'est a n y rien comprendre. Bon au final ca marche, mais je trouve ca un peu laid et ne voit surtout pas quelle est la raison du non fonctionnement de la premiere facon ...

    Serait ce possible que cela soit un bug de JRE ? Ou moi qui ai codé ca n'importe comment?

    Merci de reflechir a la question

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Par défaut
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().compareTo("delete")==0) {
                afficheDialogue();   
            }
        }
    serait avantageusement remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (e.getSource()==this.delete) { ....}
    ou, si comparaison itérative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Object trigger=e.getSource();
    if (trigger==this.delete) {....}
    if (trigger==this.etc ...
    enfin bon, ce n'est qu'un conseil.

    sur quel éditeur développes-tu ? le problème persiste-t-il si dans ton code tu remplaces afficheDialogue() par this.afficheDialogue() ?

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Par défaut
    en passant, pourquoi as-tu mis la création du popUp dans une méthode, et non dans le constructeur de ton JPanel ? afin de bien renseigner le compilateur sur la valeur globale de tes champs, je te conseille :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private void creerPopup() {
            this.monPopup = new JPopupMenu ();
            this.liaison = new JMenu("liaison to");
            this.delete = new JMenuItem ("delete");
            this.delete.addActionListener (new ActionListener () {
                public void actionPerformed (ActionEvent e) {
                    this.afficheDialogue();
               }
            });
            this.proprietes = new JMenuItem ("properties");
            this.monPopup.add(this.liaison);
            this.monPopup.add(this.delete);
            this.monPopup.add(this.proprietes);
        }
    et d'en prendre l'habitude.

    j'espère que les a déclarés en champs globaux de ta classe

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Alors, j' utilise Netbeans comme IDE.
    Pour ce qui est des this, bah c'est une habitude (mauvaise) car je suis développeur C++ a la base, donc on s'en fout du this , meme si tu as raison.

    la methode creerPopup est appelée dans le constructer, et comme tu peux le voir c est une methode private. En gros c est simplement une facon pour moi de me retrouver si le constructeur est trop conséquent.

    Sinon, je viens de modifier en passant en e.getSource , effectivement c est + classieux ... mais cela reste laid par rapport a la facon habituelle de faire.

    Pour ce qui est d'ajouter this. pour afficheDialogue(), pas la peine, j' avais tester avec un System.out.println, et meme combat, n affiche rien.

    Enfin c est deja plus propre a present , c est deja ca

    Merci bien

    Si t as une idée pour le comment du pourquoi ca mrche pas autrement, je suis preneur

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Par défaut
    honnêtement, je reste circonspect. peut-être une piste ?

    ta méthode actionPerformed est bien publique comme l'exige la syntaxe, mais elle est enfermée dans une méthode privée, peut-être que c'est ça le souci.

    essaie de reprendre ta syntaxe originale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    monPopup = new JPopupMenu ();
            liaison = new JMenu("liaison to");
            delete = new JMenuItem ("delete");
            delete.addActionListener (new ActionListener () {
                public void actionPerformed (ActionEvent e) {
                    afficheDialogue();
               }
            });
            proprietes = new JMenuItem ("properties");
            monPopup.add(liaison);
            monPopup.add(delete);
            monPopup.add(proprietes);
    mais au lieu de l'enfermer dans une méthode privée, mets-la dans ton constructeur, et dis-nous ce qu'il en est ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Meme combat ...

    Ayant avancé plus loin dans le projet, je retombe sur le meme probleme plus loin ... mais dans une JDialog ce coup ci ... je tilt vraiment pas :s

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Par défaut
    ajoute ton delete au popup avant d'ajouter ton écouteur dessus

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    ????

    C'est censé marché un brol pareil? Non quand meme? ...

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Par défaut
    non honnêtement c'est une piste perdue, mais je ne vois pas où est le souci avec ta classe anonyme ..

    au hasard, vérifie que tu as bien défini

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private JMenuItem delete
    et pas JMenu ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Tout cela est ok , j ai verifier le code 10 fois et des potes aussi ... On comprend pas pourquoi en passant par this ca passe, et pas en passant par le cas habituel ... Incompréhensible ... Bug de l'ami swing peut etre ...

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

Discussions similaires

  1. Probleme avec print dans un fichier
    Par goblin dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2005, 18h15
  2. Probleme avec guillemets dans commande HREF
    Par angelevil dans le forum ASP
    Réponses: 4
    Dernier message: 02/05/2005, 19h06
  3. [ADO.NET] Problème avec Insert dans base de données
    Par mpascolo dans le forum Accès aux données
    Réponses: 9
    Dernier message: 24/01/2005, 09h36
  4. [C#] Probleme avec TextBox dans un DataGrid
    Par Oberown dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/12/2004, 16h05
  5. [langage] Probleme avec caractère '$' dans script Perl
    Par zouetchou dans le forum Langage
    Réponses: 11
    Dernier message: 24/07/2004, 15h35

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