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...