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 :

Détecter quand le pointeur souris sort d'une APP.


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 82
    Par défaut Détecter quand le pointeur souris sort d'une APP.
    Bonjour,

    Tout d'abord, la description de l'APP (qui explique en partie le problème).

    Une JWindow, entièrement recourte de JPanel.
    Je souhaite détecter tout mouvement de la souris hors de la JWindow:

    Test 1 :
    Toolkit.getDefaultToolkit().addAWTEventListener
    Problème : A chaque fois qu'un composant est entré ou sorti par mon pointeur, un evènement est lancé.

    Test2 :
    J'ajoute un addMouseListener sur la Jwindow.
    Problème les évènement MOUSE_ENTERED & MOUSE_EXITED ne sont jamais lancé par la Jwindow... car elle est entièrement recouverte de JPanel.


    Voyez vous une solution ?
    Je pense bien à rajouter un Glasspane, mais je suis un peu frileux car ca fait un peu bricolage non ?
    N'y a t'il pas un moyen en utilsant les objets que je possède déja ? (La Jwindow & les JPanels)


    Merci d'avance
    R

  2. #2
    Membre averti
    Profil pro
    Architecte IT
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Architecte IT

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Par défaut
    Tu as regardé le type des composants sur lesquels les évènements sont redispachés par le Toolkit.getDefaultToolkit().addAWTEventListener ? Aucun n'est sur la JWindow ?

    Tu peux essayer d'ajouter un listener sur le contentpane (en faisant jWindow.getContentPane().addMouseListener(...)).

    Sinon dans la catégorie bricolage, tu peux écouter le MOUSE_MOVED avec le Toolkit.getDefaultToolkit().addAWTEventListener et vérifier sur la position du curseur est dans la JWindow (si le rectangle que te renvoit le getBounds contient le point du MouseEvent).

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 82
    Par défaut
    Citation Envoyé par mikaMike
    Tu as regardé le type des composants sur lesquels les évènements sont redispachés par le Toolkit.getDefaultToolkit().addAWTEventListener ? Aucun n'est sur la JWindow ?
    Non, tous proviennent des composants "fils".

    Tu peux essayer d'ajouter un listener sur le contentpane (en faisant jWindow.getContentPane().addMouseListener(...)).
    Ca ne change rien. Pas d'évènement dispatché.

    Sinon dans la catégorie bricolage, tu peux écouter le MOUSE_MOVED avec le Toolkit.getDefaultToolkit().addAWTEventListener et vérifier sur la position du curseur est dans la JWindow (si le rectangle que te renvoit le getBounds contient le point du MouseEvent).
    Ca marcherait pas mal, sauf si un utilisateur fait apparaitre une fenêtre par dessus l'app. (et c'est un évènement critique que je dois détecter).

    Merci quand meme

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Tu peux peut-être utiliser un JPanel (ou la JWindow) à toi qui mette un MouseListener sur tous ses sous-composants en utilisant un ContainerListener.

    Ensuite, à chaque MouseExited, tu attends un petit peu pour un MouseEntered, et en cas d'absence, tu lances ce qu'il faut.

    Je me suis amusé à coder ça, il y a peut-être plus hablie que de passer par un timer.
    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
    public class MouseTrackerPanel extends JPanel implements MouseListener,
      ContainerListener, ActionListener {
     
      private javax.swing.Timer timer;
     
      private final static int timerDelay = 1;
     
      public MouseTrackerPanel(LayoutManager layout) {
        super(layout);
        timer = new Timer(timerDelay, this);
        timer.setRepeats(false);
     
        this.addMouseListener(this);
        this.addContainerListener(this);
      }
     
      public void componentAdded(ContainerEvent e) {
        Component c = e.getChild();
        c.addMouseListener(this);
        if (c instanceof Container)
          ((Container) c).addContainerListener(this);
      }
     
      public void componentRemoved(ContainerEvent e) {
        Component c = e.getChild();
        c.removeMouseListener(this);
        if (c instanceof Container)
          ((Container) c).removeContainerListener(this);
      }
     
      public void mouseEntered(MouseEvent e) {
        timer.stop();
      }
     
      public void mouseExited(MouseEvent e) {
        timer.restart();
      }
     
      // called when the timer expires, i.e. when the mouse exits this
      public void actionPerformed(ActionEvent e) {
        System.out.println("Mouse exited !!");
      }
    }
    Et pour éviter que l'utilisateur mette une fenêtre par-dessus, tu peux utiliser setAlwaysOnTop(true) sur la JWindow.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 82
    Par défaut
    J'ai l'impression que tu as mis le doigt sur une solution potentielle


    Je propose une solution alternative :
    - Un mouse listener sur tous les composants (parfaitement executé par le AWTeventlistener en fait.
    - Chaque MOUSE_EXITED positionne un booleen au niveau de l'app.
    et lance une procédure de controle du booleen après X milliseconds.
    - Chaque MOUSE_ENTERED invalide ce boolen.

    Bon faut voir ce que ca donne dans les faits, je testerai ca Vendredi si je n'arrive pas à comprendre ta solution (faut que je fasse qques petits tests sur les containerListener, et le comportement en cas de suspension du timer ).

    Merci en tout cas
    Richard

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 82
    Par défaut
    La méthode du timer fonctionne.
    Résolu.
    Merci

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/01/2008, 12h36
  2. Réponses: 6
    Dernier message: 15/02/2007, 11h56
  3. Détecter si la souris sort du swf
    Par tom42 dans le forum Flash
    Réponses: 10
    Dernier message: 22/01/2007, 12h02
  4. Affichage d'une image avec changement quand le pointeur est dessus
    Par mauriiice dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/09/2006, 20h21
  5. Réponses: 4
    Dernier message: 11/06/2006, 05h39

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