# Verschieben von Elementen



## Evolver (29. Apr 2009)

Ich habe auf meiner graphischen Oberfläche Elemente, die man mit der Mouse verschieben kann (so wie z.b. Fenster bei Windows). Das klappt auch soweit, aber nur, wenn ich die Mouse nicht zu schnell bewege! Das komische ist aber, selbst wenn ich sie schnell bewege klaptt es, solange ich das Objekt nach unter, links oder rechts verschiebe. Will ich es aber schnell nach oben schieben, bleibt es immer wieder hängen.

Hier ein bisschen Code:

```
public class MoveObject extends Rectangle implements ...
{
	private static final int NO_DRAG = -1;
	private int dragOriginX;
	private int dragOriginY;

	private Rectangle titleBar;

	// ...

	// Verschieben starten
	public void handleMousePressed( MouseEvent event )
	{
		if( contains( event.getX(), event.getY() ) )
		{			
			if( titleBar.contains( event.getX(), event.getY() ) )
			{
				dragOriginX = event.getX();
				dragOriginY = event.getY();
			}
		}
	}

	// Verschieben stoppen
	public void handleMouseReleased( MouseEvent event )
	{
		if( contains( event.getX(), event.getY() ) )
		{
			if( dragOriginX!=NO_DRAG || dragOriginY!=NO_DRAG )
			{
				dragOriginX = NO_DRAG;
				dragOriginY = NO_DRAG;
			}
		}
	}

	// Verschieben
	public void handleMouseDragged( MouseEvent event )
	{
		if( contains( event.getX(), event.getY() ) )
		{			
			if( dragOriginX!=NO_DRAG || dragOriginY!=NO_DRAG )
			{
				int deltaX = event.getX() - dragOriginX;
				int deltaY = event.getY() - dragOriginY;
				dragOriginX = event.getX();
				dragOriginY = event.getY();
				x += deltaX;
				y += deltaY;
				titleBar.x += deltaX;
				titleBar.y += deltaY;
			}
		}
	}
}
```
Da der ganze Rest recht komplex geworden ist, es wäre also ziemlich schwierig, das als ein kleines eigenständiges Beispiel herauszulösen. Aber vielleicht sieht ja auch so jeamdn einen Fehler oder hat eine Idee?


----------



## SlaterB (29. Apr 2009)

Logging Logging Logging, Logging Logging Logging, Logging Logging Logging

in einer Methode wie handleMouseDragged() kannst du doch genau feststellen, welches aktuelle x,y von der Maus kommt,
ob contains das akzeptiert, was dragOrigin + x,y + titleBar x.y war und neu sein wird 
(interessant für das nächste Event)

ich vermute, dass du bei zu schnellen Bewegungen außerhalb des contains()-Bereich bist, was immer das auch für ein Bereich ist,
nach oben besonders empfindlich, da dort schnell die Grenze erreicht ist,

du solltest auch die umgebende Fläche mit einberechnen, wenn das Rechteck z.B. in der Zeichenfläche an Position
200,100 ist und ein Drag um 70 Pixel nach oben relativ zur Position des Rechtecks zu einem y von -60 führt, also außerhalb, contains=false, dann ist das als Bewegung immer noch ok,

du musst also z.B. prüfen, ob x,y des Rechtecks + event.getX()/Y innerhalb der Grenzen der äußeren Fläche liegt


----------



## Evolver (29. Apr 2009)

Ahhhhh ... super. Ja, Du hast recht, das 'contains' ist schuld. Danke, danke.


----------

