# JavaFX - MouseDragReleased ruft MouseDragExited auf



## mathiasj (2. Feb 2014)

Hallo,
ich schreibe gerade an einem kleinen Schiffe versenken Spiel. Um die Schiffe zu platzieren, soll man sie mit der Maus ziehen können. Hierfür verwende ich onMouseDragDetected, onMouseDragExited, OnMouseDragEntered und onMouseDragReleased. Soweit funktioniert alles ganz gut, aber ich habe folgendes Problem: Nachdem onMouseDragReleased aufgerufen wurde, wird automatisch onMouseDragExited aufgerufen!

Hier mein Code:


```
public class DragDetectedHandler implements EventHandler<MouseEvent> {

		@Override
		public void handle(MouseEvent e) {
			PlayingfieldField field = (PlayingfieldField) e.getSource();
			field.fillInnerRect(Color.GREEN);
			field.startFullDrag();
			e.consume();
		}
	}
	
	public class MouseDragEnteredHandler implements EventHandler<MouseDragEvent> {

		@Override
		public void handle(MouseDragEvent e) {
			PlayingfieldField field = (PlayingfieldField) e.getSource();
			field.setInnerOpacity(0.5);
			field.fillInnerRect(Color.RED);
			e.consume();
		}
	}
	
	public class MouseDragExitedHandler implements EventHandler<MouseDragEvent> {

		@Override
		public void handle(MouseDragEvent e) {
			System.out.println("mouse drag exited");
			PlayingfieldField field = (PlayingfieldField) e.getSource();
			field.setInnerOpacity(1);
			field.fillInnerRect(Color.GREEN);
			e.consume();
		}
	}
	
	public class MouseDragReleasedHandler implements EventHandler<MouseDragEvent> {

		@Override
		public void handle(MouseDragEvent e) {
			System.out.println("mouse drag released");
			PlayingfieldField field = (PlayingfieldField) e.getSource();
			field.setInnerOpacity(1);
			field.fillInnerRect(Color.RED);
			e.consume();
		}
	}
}
```

Beim draggen wird das erste Feld grün, und das Feld, auf dem ich drauf bin ist rot. Wenn ich los lasse, wird das rote Feld auch grün (weil mouseDragExited aufgerufen wird - mit println() geprüft!)

Habt ihr irgendeine Ahnung, woran das liegen könnte?

Viele Grüße,
mathiasj


----------



## mathiasj (3. Feb 2014)

So, jetzt nochmal die Handler geändert:


```
public class DragDetectedHandler implements EventHandler<MouseEvent> {

		@Override
		public void handle(MouseEvent e) {
			System.out.println("drag detected");
			PlayingfieldField field = (PlayingfieldField) e.getSource();
			field.startFullDrag();
			e.consume();
		}
	}
	
	public class MouseDragEnteredHandler implements EventHandler<MouseDragEvent> {

		@Override
		public void handle(MouseDragEvent e) {
			System.out.println("drag entered");
			e.consume();
		}
	}
	
	public class MouseDragExitedHandler implements EventHandler<MouseDragEvent> {

		@Override
		public void handle(MouseDragEvent e) {
			System.out.println("drag exited");
			e.consume();
		}
	}
	
	public class MouseDragReleasedHandler implements EventHandler<MouseDragEvent> {

		@Override
		public void handle(MouseDragEvent e) {
			System.out.println("drag released");
			e.consume();
		}
	}
```

Ausgabe, wenn ich vom einem Feld zum anderen ziehe:

drag detected  //erkannt
drag entered  //Ich bin im startfeld
drag exited  //ich verlasse das startfeld
drag entered  //ich betrete dass 2. feld
drag released  //ich lasse die maustaste los
drag exited  //???

Irgendwie beendet sich das Drag and Drop Event nicht nach dem Release...

Viele Grüße,
mathiasj


----------



## mathiasj (5. Feb 2014)

So, ich konnte mein Problem jetzt folgendermaßen lösen:


```
[...] boolean dragOver;
[...]
public class MouseDragExitedHandler implements EventHandler<MouseDragEvent> {

		@Override
		public void handle(MouseDragEvent e) {
			System.out.println("exit");
			if(dragOver == true) {
				dragOver = false;
				return;
			}
			[...]
			e.consume();
		}
	}

	public class MouseDragReleasedHandler implements EventHandler<MouseDragEvent> {

		@Override
		public void handle(MouseDragEvent e) {
			[...]
			dragOver = true;
			e.consume();
		}
	}
```

Aber das ganze ist nicht sonderlich schön, und es ist schon sehr komisch, dass MouseDragExitedHandler.handle aufgerufen wird, nachdem MouseDragReleasedHandler.handle aufgerufen wurde... Evtl. ein JavaFX Bug?

Viele Grüße,
mathiasj


----------

