# JTree Autoscroll bei Drag and Drop



## ElJarno (29. Sep 2010)

Hi Leute,
hab mir diesen Code von folgendem Thread geschnappt:
Kleines (stark vereinfachtes) Beispiel zu Drag n Drop beim JTree @ tutorials.de: Tutorials, Forum & Hilfe
Funktioniert ja soweit alles ziemlich jut. Jetzt würde ich nur noch gern die Funktion haben dass während des Drags der Tree weiter gescrollt wird sobald man den sichtbaren Bereich verlässt. Habe dazu folgendes in der Doku gefunden:

```
this.treeKostenArten.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent e) {
				Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
				((JTree) e.getSource()).scrollRectToVisible(r);
			}
		});
```

Dies funktioniert aber leider nur wenn man keinen DnD ausführt sondern lediglich ohne Node die Maustaste in der Tree gedrückt hält und dann hoch und runter fährt.

Gruß Jan


----------



## André Uhres (29. Sep 2010)

ElJarno hat gesagt.:


> Dies funktioniert aber leider nur wenn man keinen DnD ausführt



Hallo Jan,

im DropTarget kannst du dragOver überschreiben, um einen autoscroll zu machen. Die dragOver Methode wird wiederholt aufgerufen während der Benutzer damit fortfährt, die Daten über der Komponente zu ziehen. Auch wenn er die Maus anhält, geht die "drag" Operation immer noch weiter. 

Gruß,
André


----------



## ElJarno (30. Sep 2010)

Hi André,

danke schon mal für den Tip, hab mir sowas schon gedacht nur wusste ich nicht welche Methode ich dafür nehmen muss. Nur leider funktioniert, das ganze so noch nicht:

```
@Override
					public void dragOver(DropTargetDragEvent dtde) {
						super.dragOver(dtde);
						Rectangle r = new Rectangle((int) dtde.getLocation()
								.getX(), (int) dtde.getLocation().getY(), 1, 1);
						((JTree) dtde.getDropTargetContext().getComponent())
								.scrollRectToVisible(r);
					}
```
Muss ich trotzdem irgendwie noch Listener verwenden, ich mein beim Debuggen wird die Methode beim draggen ja ständig aufgerufen. Mir ist aber aufgefallen, dass sobald ich die Tree verlasse der Curser zu sonem Verbotzeichen sich ändert, muss ich eventuelle noch Methoden überschreiben die reagieren sobald ich den Zielbereich verlasse bzw. das draggen in nichtdragbaren Bereichen versuche. Sobald ich z.B. auf einer JTextfield lande verschwindet das Verbotzeichen und das draggen ist wieder möglich. Trotzdem scrollt die Tree nicht.


----------



## ElJarno (30. Sep 2010)

Oke,
habs dann jetzt so gelöst, dass sobald man sich dem Rand des ScrollPane nähert, er anfängt zu scrollen und sobald man drüber hinausschießt er damit aufhört, ist ja bei Win Explorer genau so. So wollt ich es auch driekt haben;-):


```
public void dragOver(DropTargetDragEvent dtde) {
						super.dragOver(dtde);
						Point dragPoint = dtde.getLocation();
						Point treePoint = dtde.getDropTargetContext()
								.getComponent().getLocation();
						double obereSchranke = treePoint.getY()
								+ dragPoint.getY();
						// Wenn ich mich dem Rand des TreeScrollPanes um weniger
						// als 50 näher dann soll angefangen werden zu scrollen
						// indem 50 von der Mausposition abgezogen wird um so
						// früher zu scrollen
						// ansonsten ist die untere Schranke bei Mausposition
						// plus 50
						int dif = 50;
						if (obereSchranke < 50)
							dif = -50;
						Rectangle r = new Rectangle((int) dtde.getLocation()
								.getX(), (int) dtde.getLocation().getY() + dif,
								1, 1);
						((JTree) dtde.getDropTargetContext().getComponent())
								.scrollRectToVisible(r);
					}
```


----------



## André Uhres (30. Sep 2010)

Hallo Jan,

im folgenden Artikel wird unter "Implementing automatic scrolling" im Prinzip dasgleiche gemacht, nur etwas anders programmiert:
Article: Extending JTree capabilities - dev.uhilger.de

Gruß,
André


----------

