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 :

[ActionEvent][JMenuItem]Connaitre quel bouton a été cliqué


Sujet :

AWT/Swing Java

  1. #1
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut [ActionEvent][JMenuItem]Connaitre quel bouton a été cliqué
    Bonjour à tous.

    J'ai danns ma JFrame une barre des menus, et sur chaue JMenuItem, j'ai un action listener.
    Je n'arrive pas à trouver comment savoir quel bouton a été cliqué lors d'une action.

    Vu que c'est un menu, ça m'embête un peu de définir un MouseListener. Est-ce vraiment obligatoire pour récupérer le bouton cliqué ?

  2. #2
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    D'ailleurs, ça m'embête d'autant plpus que je ne peux pas définir à la fois un ActionListener et un MouseListener, car c'est toujours l'ActionEvent qui prend le dessus...

  3. #3
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    Rectification faite, je peux.

    C'est juste que (et je ne comprends pas pourquoi) l'évènement mouseClicked n'ai jamais récupéré. Qu'à cela ne tienne, je gère avec une mousePressed+mouseReleased.

    Ma première question reste quand même en suspend : n'y a t'il pas moyen de récupérer à travers un ActionEvent l'origine de l'action (Mouse, Keyboard...)

  4. #4
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083

  5. #5
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Il faut lire un peu plus la doc

  6. #6
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    Hum, j'ai du mal m'exprimer.

    Le getSource me renvoie l'objet qui est à l'origine de mon action (en l'occurence un JMenuItem). Moi, ce que je voudrais savoir c'est QUI a déclenché cet évènement : ma souris, mon clavier, autre chose (robot...) ?

    Sauf si je l'utilise mal, ou si je vous ai pas très bien compris, mais mon code m'affiche JMenuItem, pas MouseEvent comme je le voudrais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			public void actionPerformed(ActionEvent e) {
    				System.out.println("e.getSource.getClass "+e.getSource().getClass());
    			}

  7. #7
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Plutôt http://javasearch.developpez.com/j2s...getModifiers() alors. Tu choppes si tu as un KEY_EVENT_MASK ou MOUSE_EVENT_MASK ou ... en faisant une comparaison de bits.

  8. #8
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    OK, mais une fois que je sais que j'ai un MouseEvent, comment je fais pour le récupérer et savoir lequel de mes boutons a été cliqué ?

  9. #9
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Bah j'comprends pas ton truc... si tu cliques un bouton alors ton e.getSource() renvoie ton bouton... logique !

    Tu la fais comment ton action ????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Action action = new MonAction();
    JMenuItem item = new JMenuItem(action);
    JButton button = new JButton(action);
    Si tu cliques sur le JMenuItem alors e.getSource().equals(item) = true, si c'est le button alors e.getSource().equals(button) = true.
    Mais mon intuition me dit que tu ne fais pas comme ci-dessus...

  10. #10
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    Hum, OK. Donc je me suis mal exprimé.

    Prenons un exemple concret :
    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
    JMenuItem siteNameMenuItem = new JMenuItem();
    		siteNameMenuItem.setText(siteName);
    		siteNameMenuItem.setToolTipText("<HTML><B>Left click</B> to select this site.<BR><B>Right click</B> to remove it.<HTML>");
    		siteNameMenuItem.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e) {
    				System.out.println("e.getSource.getClass "+e.getSource().getClass());
    			}
    		});
     
    		siteNameMenuItem.addMouseListener(new MouseListener(){
    			public void mouseClicked(MouseEvent e) {}
    			public void mouseEntered(MouseEvent e) {}
    			public void mouseExited(MouseEvent arge0) {}
    			public void mousePressed(MouseEvent e) {}
    			public void mouseReleased(MouseEvent e) {
    				//Left click -> Select the site
    				if(SwingUtilities.isLeftMouseButton(e)){
    					//If the user select a site, then set this site as the current site
    					TRAITEMENT DE SELECTION DE MON SITE...
    				}else if(SwingUtilities.isRightMouseButton(e)){
    					//right click -> remove the site
    					try{
    						//If the user right click a site, then retrieve its name
    						String siteNameToDelete = ((JMenuItem)e.getSource()).getLabel();
    						TRAITEMENT DE SUPPRESSION DU SITE...
    			  }
    		   }
         });
    Donc ici, dans tous les cas, je déclenche un ActionEvent (et donc fait l'affichage de la classe de l'objet qui a été "activé" (JMenuItem en l'occurence), mais pour pouvoir faire un traitement différent selon que l'utilisateur à fait un clic droit ou un clic gauche, je suis obligé de définir un MouseListener.

    Vu que l'objet écouté est dans un menu, il est possible d'y accéder autrement qu'avec la souris (je pense notament au clavier, mais pourquoi pas un autre évènement, comme un Robot par exemple... !).
    Je voudrais définir un traitement par défaut en cas de sélection de ce JMenuItem (en l'occurence, Sélection d'un site) avec un cas particuliers : le clique droit de ma souris qui doit non pas sélectionner, mais supprimer le site.
    Si je mets 2 écouteurs sur mon JMenuItem, avec le traitement par défaut dans mon ActionListener et le traitement "particuliers" dans mon MouseListener, alors sur chaque clique droit, j'ai les 2 évènements qui sont pris en compte. Je sélectionne donc un site que j'essaie de supprimer... Vous voyez le conflit venir ?

    C'est pour ça que j'aimerais bien récupérer le type d'évènement à la source de mon ActionListener, pour pouvoir y appliquer directement le traitement souhaité !
    En même temps, j'ai fait ce que Gfx m'a dit, et je crois que je viens de trouver ma réponse...
    Citation Envoyé par Javadoc ActionEvent
    The listener is therefore spared the details of processing individual mouse movements and mouse clicks, and can instead process a "meaningful" (semantic) event like "button pressed".
    Ce qui veut dire, si je comprend bien que l'ActionListener ne peut pas faire la différence des évènements et gère des évènements génériques comme "Boutton pressé".

    Si quelqu'un veut bien confirmer ce que j'ai traduit, je suis preneur .

    Si j'ai raison, est-ce que je me trompe en disant que la seule solution, dans mon cas, consiste à instancier tous les listeners excepté l'action listener ? (MenuKeyListener, MouseListener, KeyListener, FocusListener, ItemListener) -je les ai pas encore tous regardés, et je suppose que certains se recouppent ou sont, dans mon cas, superflus !

  11. #11
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Ahhh d'accord !
    C'est vrai que même si on fait un clic droit sur un JMenuItem, l'action est executée... (ce qui est pas très standard comme comportement d'ailleurs...)

    Ce que je te propose c'est de faire un listener global qui implémente plusieurs type de listener genre

    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
    public MonListener implements MouseListener, KeyListener {
        public void mousePressed(MouseEvent e) {
            mouseReleased(e);
        }
        public void mouseReleased(MouseEvent e) {
            if (e.isPopupTrigger()) {
                doActionDuClicDroit(); // action clic droit
            } else {
                doActionDefault();
            }
        }
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode().equals(KeyEvent.VK_ENTER) || ... ) {
                doActionDefault();
            }
        }
        ...
    }
    Et tu l'ajoutes bien sûr autant de fois que nécessaire dans ton JMenuItem

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    menuItem.addMouseListener(...)
    menuItem.addKeyListener(...)

  12. #12
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    Citation Envoyé par natha
    C'est vrai que même si on fait un clic droit sur un JMenuItem, l'action est executée... (ce qui est pas très standard comme comportement d'ailleurs...)
    Euh, j'aurais tendance à dire qu'au contraire, c'est tout ce qu'il y a de plus standard : un clic, c'est une action...

    Sinon, oui, je suis complètement d'accord avec toi pour la classe implémentant pleins de listeners, mais d'une je ne sais pas trop quels sont les listeners à implenter (bon ça d'accord, je n'ai qu'à chercher), de deux je me demande si j'arriverais à avoir un comportement aussi générique et global avec une foultitude de listener que celui que j'ai avec un simple action listener. En gros je me demande si tous mes listeners suffiront pour capter vraiment TOUTES les actions comme le fait l'action listener.

    Je pensais également implémenter dans ma classe de listeners l'actionListener dans lequel j'aurais fait un test sur une variable, mise à jour par le mouseEvent (pour définir si c'est un click droit ou un click gauche..) mais le problème c'est que je n'ai aucun moyen de certifié lequel de mes 2 listeners sera appelé en premier -j'ai d'ailleurs l'impression que c'est le actionListener !
    Alors pareil, si quelqu'n sait comment je pourrais forcer le passage par le mouseListener (quand il a lieu...) avant d'aller dans le actionListener, je suis preneur.

    Comment ça je suis éxigeant ?

  13. #13
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par leminipouce
    Euh, j'aurais tendance à dire qu'au contraire, c'est tout ce qu'il y a de plus standard : un clic, c'est une action...
    Dans le cas du ActionListener oui, mais j'ai testé sur un JMenuItem construit avec une Action, ce qui n'est pas tout à fait la même chose et il me lance quand même l'action alors qu'il ne le fait pas sur un JButton si je fais un clic droit. C'est pour ça que je dis que ce n'est pas correct comme comportement. Le clic droit est une action spécifique, pas une action par défaut.

    Pour le reste je ne peux pas vraiment t'aider. Je ne vois pas vraiment comment faire si ce n'est implémenter les différents types de listener.

    En tout cas si tu trouves kkch, dis nous !

  14. #14
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Euh attend, j'viens de trouver . Essaie ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		JMenuItem test = new JMenuItem("test");
    		test.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				logger.debug("action");
    				if ((e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) {
    					logger.debug("bouton droit");
    				}
    			}
    		});
    C'est bien ce que je disais plus haut ! Comparaison bit à bit avec getModifiers()...

  15. #15
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    Super, ça semble marcher.

    Bon, je sais, je suis un peu rabat joie, mais que ce passe-t'il si jamais je n'ai pas de troisième bouton sur ma souris ? -je viens de trouver un vieille souris dans un coin qui n'a que 2 boutons, mais j'ai pas d'adapter pour la brancher sur mon portable. Dès que j'ai plus d'info sur le fonctionnement in-fine avec seulement 2 boutons je vous tiens au courant.

    Merci beaucoup natha de t'être donner autant de mal pour moi.

  16. #16
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Si elle n'a que 2 bouton je ne sais pas si c'est le BUTTON3_MASK ou BUTTON2_MASK qui est pris en compte. Tu peux ajouter encore des choses compliquées style avec je sais plus quelle librairie tu récupères le nombre de boutons de la souris, etc... La balle est dans ton camp maintenant

    Content d'avoir aidé

  17. #17
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    Bon, je viens fermer le sujet puisqu'il est résolu (la solution de natha est la bonne - Merci encore).
    Par contre, je ne peux pas vous en dire plus sur les souris deux boutons... car mine de rien, c'est sacrément compliqué d'en trouver (s'en payer of course !).

    Si jamais j'arrive à en avoir une, je vous tiendrai au jus.

    @+

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

Discussions similaires

  1. savoir sur quel bouton l'utilisateur clique
    Par Mihalis dans le forum Delphi
    Réponses: 4
    Dernier message: 13/06/2007, 21h07
  2. Réponses: 3
    Dernier message: 15/11/2006, 13h57
  3. Réponses: 10
    Dernier message: 07/11/2006, 12h00
  4. [WinForms]comment savoir sur quel bouton j'ai cliqué?
    Par bossun dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 14/03/2006, 14h18
  5. Formulaire -> pour savoir sur quel bouton on a cliqué.
    Par Thierry8 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/09/2005, 18h53

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