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 :

Récupérer à tous les coups le mouse exited (ou équivalent)


Sujet :

AWT/Swing Java

  1. #1
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut Récupérer à tous les coups le mouse exited (ou équivalent)
    J'ai programme dont un composant a besoin, pour se dessiner correctement, de savoir si la souris est sur le composant, ou pas. Ce composant, en plus, support le drag and drop. Le drag and drop marche bien depuis des mois, mais j'ai un soucis pour mes event souris.

    Quand je fais:
    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
    addMouseMotionListener(new MouseMotionListener() {
    			private void log(MouseEvent e){
    				System.out.println(e);
    			}
    			@Override
    			public void mouseMoved(MouseEvent e) {
    				log(e);
    			}
    			@Override
    			public void mouseDragged(MouseEvent e) {
    				log(e);
    			}
    		});
    		addMouseListener(new MouseListener() {
    			private void log(MouseEvent e){
    				System.out.println(e);
    			}
    			@Override
    			public void mouseReleased(MouseEvent e) {
    				log(e);
    			}
    			@Override
    			public void mousePressed(MouseEvent e) {
    				log(e);
    			}
    			@Override
    			public void mouseExited(MouseEvent e) {
    				log(e);
    			}
    			@Override
    			public void mouseEntered(MouseEvent e) {
    				log(e);
    			}
    			@Override
    			public void mouseClicked(MouseEvent e) {
    				log(e);
    			}
     
    		});
    Et que je lance un drag and drop, j'obtiens les évènements suivants:


    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
    java.awt.event.MouseEvent[MOUSE_ENTERED,(2,52),absolute(180,147),button=0,clickCount=0] on Add stationary (H)
    java.awt.event.MouseEvent[MOUSE_MOVED,(2,52),absolute(180,147),clickCount=0] on Add stationary (H)
    java.awt.event.MouseEvent[MOUSE_EXITED,(-73,-11),absolute(105,84),button=0,clickCount=0] on Add stationary (H)
    java.awt.event.MouseEvent[MOUSE_ENTERED,(35,43),absolute(105,84),button=0,clickCount=0] on Add warm
    java.awt.event.MouseEvent[MOUSE_MOVED,(35,43),absolute(105,84),clickCount=0] on Add warm
    java.awt.event.MouseEvent[MOUSE_EXITED,(-70,-30),absolute(0,11),button=0,clickCount=0] on Add warm
    java.awt.event.MouseEvent[MOUSE_ENTERED,(32,4),absolute(48,45),button=0,clickCount=0] on Add cold
    java.awt.event.MouseEvent[MOUSE_MOVED,(32,4),absolute(48,45),clickCount=0] on Add cold
    java.awt.event.MouseEvent[MOUSE_MOVED,(40,18),absolute(56,59),clickCount=0] on Add cold
    java.awt.event.MouseEvent[MOUSE_MOVED,(36,23),absolute(52,64),clickCount=0] on Add cold
    java.awt.event.MouseEvent[MOUSE_MOVED,(31,26),absolute(47,67),clickCount=0] on Add cold
    java.awt.event.MouseEvent[MOUSE_MOVED,(29,26),absolute(45,67),clickCount=0] on Add cold
    java.awt.event.MouseEvent[MOUSE_MOVED,(28,27),absolute(44,68),clickCount=0] on Add cold
    java.awt.event.MouseEvent[MOUSE_PRESSED,(28,27),absolute(44,68),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on Add cold
    java.awt.event.MouseEvent[MOUSE_DRAGGED,(32,28),absolute(48,69),modifiers=Button1,extModifiers=Button1,clickCount=0] on Add cold
    Comme on le vois, dès que je lance un drag and drop, je n'ai plus aucun évènement reçu. Du coup je me demande quel event awt je peux rechercher pour savoir que la souris, dans son drag and drop, est sortie du composant.

    Je peux capter avec mon code a peu près tous les event, mais je n'ai pas trouvé celui qui m'aidera.

    Si ca peu aider, le dnd est géré comme ceci:
    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
    DragSource dragSource = DragSource.getDefaultDragSource();
    		dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY, new DragGestureListener() {
     
    			@Override
    			public void dragGestureRecognized(DragGestureEvent dge) {
    				getModel().setEnabled(false);
    				getModel().setPressed(false);
    				getModel().setEnabled(true);
    				Transferable t = new Transferable() {
    					DataFlavor[] tr ;
    					{
    						try{
    							tr = new DataFlavor[] {new DataFlavor(NODE_MIME_TYPE)};
    						} catch(ClassNotFoundException e){
    							e.printStackTrace();
    						}
    					}
    					@Override
    					public boolean isDataFlavorSupported(DataFlavor flavor) {
    						log.debug("Got mimetype {}",flavor.getMimeType());
    						return flavor.getMimeType().split(";")[0].equals(NODE_MIME_TYPE);
    					}
     
    					@Override
    					public DataFlavor[] getTransferDataFlavors() {
    						return tr;
    					}
     
    					@Override
    					public Object getTransferData(DataFlavor flavor)
    							throws UnsupportedFlavorException, IOException {
    						if (isDataFlavorSupported(flavor)){
    							return NodeSource.this;
    						}
    						throw new UnsupportedFlavorException(flavor);
    					}
    				};
    				dge.startDrag(null, svgIcon.getBufferedImage(),new java.awt.Point(40,40),t,null);
    			}
    Le but ici, c'est de créer un panneau qui se cache quand la souris s'en va, histoire de gagner de la place. Là, je suis obligé après le dnd de revenir vers le panneau puis ressortir...

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Bonjour @tchize_
    si je comprends bien, la souris survole plusieurs composants (dont la méthode toString a été redéfinie pour identifier le composant survolé : cold, warm, stationary ...)
    Ces composants sont probablement disposés sur un JPanel
    c'est sur un de ces composants que le dnd doit se faire ou sur le JPanel de base ?
    c'est à dire est-ce que on va "larguer" un composant sur un des composants ou sur le fond ?

    sinon Joyeux Noël en attendant.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    J'ai jamais essayé mais j'imagine qu'on doit pouvoir utiliser DragSource.createDragGestureRecognizer(...) pour créer une instance d'une classe qui étend java.awt.dnd.MouseDragGestureRecognizer, dans laquelle on peut intercepter les évènements souris par surcharge de la méthode mouseExited(). Et l'utiliser en relais de l'autre listener, pendant le drag.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Oui mais non.

    Jouer sur le drag gesture est chiant. Pour faire simple, j'ai un Panel latéral. Il contient plein de truc, y compris les add Machin qui sont des boutons servant aussi de drag source. Le drop se fait complètement ailleurs, on a déjà quitté le JPanel depuis longtemps.

    Le Panel se trouve dans un JLayer, qui me permet de réceptionner tous les events sur sa surface, lui même dans un JXCollapsiblePanel. Le but est de collapser le panel dès qu'on en sort.

    C'est le JLayer qui fait ces affichage.Problème, dès que je démarre un Drag, le JLayer ne reçois plus aucun event mouse....

    J'ai même essayer de réceptionner TOUT les event AWT. Je reçois encore des tonnes d'autres trucs, mais rien qui m'indiquerait que je suis sortis du panel.

    Pour le moment je résoud mon problème en cachant le panel dès que le je reçois un event drag, mais c'est pas top.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Et en mettant un DropTargetListener sur le JXCollapsiblePanel, et en exploitant dragExit() ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ca deviens tordu, mais je tenterais pour voir. J'ai quand même un doute dans le sens ou, si ma mémoire est bonne, ça déclenche le drag exit aussi quand tu passe sur un sous composant ne gérant pas le drop.

Discussions similaires

  1. [RegEx] Récupérer tous les liens d'une page
    Par micatmidog dans le forum Langage
    Réponses: 13
    Dernier message: 03/11/2006, 01h37
  2. Récupérer tous les champs de même nom
    Par hlr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/02/2005, 13h26
  3. Réponses: 7
    Dernier message: 08/01/2005, 13h24
  4. [Plugin] Récupérer tous les fichiers *.java d'un workspace
    Par Satch dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 02/06/2004, 12h51
  5. [BP]Imprimer un bitmap à tous les coups
    Par mennix dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 28/01/2004, 19h42

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