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 :

Redispatch d'evévenements souris à travers un GlassPane


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Points : 160
    Points
    160
    Par défaut Redispatch d'evévenements souris à travers un GlassPane
    Bonjour,

    en suivant le tutorial http://java.sun.com/docs/books/tutor...html#glasspane, j'ai un GlassPane qui retransmets les evenements souris au composant obtenu à l'aide de la méthode SwingUtilities.getDeepestComponentAt


    Mon problème est que pour les evenements mouseDragged, ça ne marche pas : l'évenement n'est pas renvoyé au bon composant, qui devrait être celui sur lequel l'évenement Drag a commencé... Comment résoudre ce problème?

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Le getDeepestComponentAt te renvoie l'élément directement présent sous la souris. Or l'évènement mouseDragged est déclenché de façon continuelle tout au long du déplacement. Donc le getDeepestComponentAt sur l'évènement n'as absolument pas à te renvoyer l'élément de départ du drag, mais l'élément courrant. Par contre il te suffirait de retenir en mémoire l'élément présent sous la souris au dernier mousePressed (ce qui correspond au départ du drag par définition).
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Points : 160
    Points
    160
    Par défaut
    L'evenement MouseDragged est déclenché de façon continuelle, mais toujours sur le component de départ, pas sur l'élément sous la souris. Avec ce redispatch, ce n'est pas le cas, et ça modifie donc le comportement de la frame : les evenements ne sont pas envoyés au même component que s'il n'y avait pas le GlassPane. Une idée de comment résoudre ça?

  4. #4
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par Tellmarch Voir le message
    Une idée de comment résoudre ça?
    C'est difficile de t'aider sans connaitre le contexte. Souvent il suffit d'ajouter le MouseMotionListener directement au composant intéressé. Décris ce que tu veux faire.

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par sinok Voir le message
    Le getDeepestComponentAt te renvoie l'élément directement présent sous la souris. Or l'évènement mouseDragged est déclenché de façon continuelle tout au long du déplacement. Donc le getDeepestComponentAt sur l'évènement n'as absolument pas à te renvoyer l'élément de départ du drag, mais l'élément courrant. Par contre il te suffirait de retenir en mémoire l'élément présent sous la souris au dernier mousePressed (ce qui correspond au départ du drag par définition).
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Points : 160
    Points
    160
    Par défaut
    C'est difficile de t'aider sans connaitre le contexte. Souvent il suffit d'ajouter le MouseMotionListener directement au composant intéressé. Décris ce que tu veux faire.
    Bah par exemple, dans le tutoriel sun que j'ai cité, ce glassPane change le comportement des controles... tu peux le voir en cochant la case glassPane visible une premiere fois, puis en faisant un MousePressed dessus, et le mouseReleased au dessus d'un autre controle.
    La case à cocher ne reçoit pas l'évenement du mouseReleased à cause du redispatch erroné, et reste enfoncée. Je veux éviter ce genre de comportements...


    Par contre il te suffirait de retenir en mémoire l'élément présent sous la souris au dernier mousePressed (ce qui correspond au départ du drag par définition).
    Donc stocker le component sous la souris au mousePressed, et lors de mouseDragged et mouseReleased, au lieu de dispatcher l'event au component donné par le getDeepestComponentAt, le renvoyer au component stocké...
    Ok pour ces deux là ça peut peut-être marcher, par contre j'ai un doute sur les mouseEntered et mouseExited... Surtout pour le dernier, l'event ne va pas non plus être envoyé au bon component non? Comment faire dans ce cas là? Ou est-ce qu'il n'y a pas une méthode plus générale...

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    LE glasspane est un composant en lui même qui prend tout l'espace au dessus du root pane, donc à partir du moment où tu installes un MouseListener dessus tu ne peux bien sur plus espérer obtenir les events des composants en dessous, car seul le composant de plus haut niveau les reçoit. C'est le concept même du Glasspane. Donc les mouseEntered et exited tu peux oublier, la seule chose que tu peux faire est de vérifier lors du mouseMoved que le conposant en dessous a changé depuis le dernier mouseMoved. Bref il te faut toujours stocker le composant précédent.

    La question étant que cherches tu vraiment à réaliser avec ton GLassPane.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Points : 160
    Points
    160
    Par défaut
    Ah oui c'est vrai... Il faut tout faire à la main donc...
    Ce tutoriel induit vraiment en erreur :s

    Merci pour les réponses.

    (Avec mon glassPane, je dois, un peu comme dans le tutoriel :
    - faire du dessin au dessus de tous les composants
    - je voulais gérer du drag and drop complexe en interceptant les evenements souris, mais je peux le faire en rajoutant des gestionnaires sur tous les controles concernés à la limite
    - J'ai besoin par moment de bloquer tout sauf une partie des controles, comme dans le tutoriel)

  9. #9
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Pour bloquer les contrôles d'un JPanel donné, tu peux éventuellement utiliser la classe "Disabled Panel" présentée ici: http://tips4java.wordpress.com/2009/...isabled-panel/
    Pour le cas où tu veux laisser quelques contrôles actif dans le JPanel, le plus facile c'est d'utiliser la récursion pour parcourir tous les contrôles du JPanel et faire le "disable" individuel de chaque contrôle à désactiver.

  10. #10
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Quelque chose de tout récent s'apparentant un poil à ce que tu veux faire: http://free-the-pixel.blogspot.com/2...-multiple.html
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Points : 160
    Points
    160
    Par défaut
    Merci pour les liens donnés, c'était intéressant.
    J'ai finalement réussi à faire ce que je voulais en gérant les évenements souris sur tous les controles plutot que par un redispatch.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/03/2015, 11h25
  2. GlassPane et curseur de souris
    Par Lady dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 12/07/2007, 09h24
  3. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54
  4. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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