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 :

Separator qui déclenche un MouseEvent


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 38
    Par défaut Separator qui déclenche un MouseEvent
    Bonjour à tous,

    J'ai un petit soucis avec un JPopupMenu. Voici mon 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
    JPopupMenu popup = new JPopupMenu();
    popup.add(new JMenuItem("Menu 1"));
    popup.addSeparator();
    popup.add(new JMenuItem("Menu 2"));
    popup.add(new JMenuItem("Menu 3"));
     
    popup.setLocation(_mouseRealPoint.x-10, _mouseRealPoint.y-10); //_mouseRealPoint.x et _mouseRealPoint.y correspondent aux positions de la souris
    popup.setVisible(true);
     
    popup.addMouseListener(new MouseListener() {
              @Override
              public void mouseReleased(MouseEvent e) {}				
              @Override
              public void mousePressed(MouseEvent e) {}				
              @Override
              public void mouseExited(MouseEvent e) {
                        ((JPopupMenu)e.getSource()).setVisible(false);
    							}		
              @Override
              public void mouseEntered(MouseEvent e) {}			
              @Override
              public void mouseClicked(MouseEvent e) {}
              });
     
    }
    En gros, un evenement déclenche l'apparition d'un JPopupMenu, grâce aux coordonnées je fais en sorte que la souris se trouve à l'interieur du JPopupMenu, et que celui-ci disparaisse dès que la souris en sort.

    Cela fonctionne très bien sans Separator, mais dès que j'ajoute le Separator (3ème ligne de mon code), si ma souris survol/traversse le Separator, cela déclenche l'évenement mouseExited() et mon JPopupMenu disparait.

    Quelqu'un peut il m'expliquer pourquoi ? En esperant vous avoir donné suffisemment d'éléments,

    Merci d'avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Bonjour,
    c'est le problème du mouselistener ajouté sur le JPopupMenu, qui est ajouté automatiquement sur les JMenuItems qui le composent.

    Donc avec ton code, à chaque fois que ta souris sort d'un JMenuItem, le mouseExit est déclenché. Tu ne l'as remarqué que sur le séparateur parce que sa surface est plus importante.

    La seule solution que j'ai trouvée, c'est de vérifier où se trouve la souris, avant de fermer le pop :
    si elle est dedans, on ne fait rien, si elle est dehors, on ferme.

    Ça donne :
    Le code pour tester si le pointeur de la souris est dans un Compo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	private boolean mouseIsOverElement(Component compo){
    		Point pt=MouseInfo.getPointerInfo().getLocation();
    		Point ptCompo=compo.getLocationOnScreen();
    		return (pt.x >= ptCompo.x
    				&& pt.x <= ptCompo.x + compo.getWidth()
    				&& pt.y >= ptCompo.y
    				&& pt.y <= ptCompo.y + compo.getHeight());
    	}
    Son utilisation dans ta méthode mouseExited :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		@Override
    		public void mouseExited(MouseEvent e) {
    			if(!mouseIsOverElement((JPopupMenu)e.getSource())){
    				((JPopupMenu)e.getSource()).setVisible(false);
    		}
    Ça fonctionne

    J'avais trouvé une autre idée plus élégante sur le net (suppression des listeners des JMenuItems), mais elle ne fonctionne pas

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 38
    Par défaut
    Merci beaucoup ça fonctionne nickel !

    En revanche (et je n'ai pas d'explication ), je confirme que le même code sans la ligne 3
    fait exactement ce que je voulais à savoir disparaitre au moment où on sort du JPopupMenu ... étrange.

    Mais merci encore

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/08/2007, 16h20
  2. Réponses: 12
    Dernier message: 20/10/2006, 11h49
  3. action qui déclenche plusieurs actions
    Par imane_bennouna dans le forum Struts 1
    Réponses: 6
    Dernier message: 08/08/2006, 15h48
  4. Réponses: 2
    Dernier message: 14/06/2006, 15h04
  5. Réponses: 5
    Dernier message: 26/09/2005, 15h36

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