# scrollbare Karte per JScrollPane?



## Des (11. Apr 2012)

Hallo Community!

Ich schildere erstmal mein Problem, ich hoffe, es ist nicht zu konfus:
Ich habe meine Spielfläche auf einem JPanel, das in einem JScrollPane liegt. Dieses soll selbstständig scrollen, wenn man die Maus in einen gewissen Bereich bewegt. Das funktioniert auch schon soweit, aber:

Ich bewege das JScrollPane mit scrollPane.getViewport().scrollRectToVisible(Rectangle r); um 5 Pixel pro Schleifendurchlauf.
Der Aufruf dieser Zeile dauert unter Umständen an einem leicht betagten Rechner aber sehr lange. (An einem Q6600 ist alles toll, am Atom oder Pentium4 treten bei 100% CPU Auslastung die Probleme auf.) Wenn ich die Zeit vor und nach scrollRectToVisible(Rectangle r) messe, bekomme ich zwischen den beiden Zeiten Differenzen von 30 bis 75 Millisekunden. Das hat zur Folge, dass das ScrollPane sehr ruckartig und unregelmäßig scrollt.

Zum Inhalt des zu scrollenden Panels: Der Viewport ist ein JPanel auf das ich direkt mehrere (sehr viele, durchaus auch übereinander) BufferedImages male (awt). Ich habe also die paint()-Methothe des JPanels überschrieben und male alle sichtbaren Bilder mit drawImage(). Ich weiß, das soll man wohl irgendwie anders machen, aber insgesamt dauern aber die paint()-Aufrufe nur 8-15 Millisekunden (dies ließe sich bestimmt optimieren, sehe aber hier im Moment noch kein Problem).

Kommen wir zu meiner Frage: Wieso dauert das scrollRectToVisible so lange, wenn das eigentliche malen des Viewports so schnell geht? Wie kann man das Problem beheben? Was macht scrollRectToVisible intern eigentlich so alles?

zur Lösung des Problems: Hilft es, wenn ich das JScrollPane rausschmeiße und mein Panel per Hand (zB setBounds) herumschiebe?

Danke
Daniel


----------



## Marco13 (11. Apr 2012)

Schwer zu sagen, da gibt es viele Möglichkeiten. Ganz unfundiert mal aus dem Bauch heraus kannst du  mal schauen, ob man mit JViewport (Java Platform SE 6) was erreicht. Wenn nicht, muss man mal genauer schauen...


----------



## Des (11. Apr 2012)

setScrollMode habe ich schon alle 3 Varianten durchgetestet, ändert irgendwie aber nichts an der Dauer des Aufrufs. Ich vermute mal, das bezieht sich auch nur auf das "echte" scrollen zB per ScrollBar und nicht auf scrollRectToVisible. Oder sollte man scrollRectToVisible nicht benutzen, wenn man nur ein bisschen scrollt?
tjo...


----------



## Marco13 (11. Apr 2012)

Hmja, man könnte mal versuchen, ob man nicht schon mit setViewPosition was hinkriegt, was reicht, aber ob das schneller ist, müßte ich auch erst austesten. Im Moment kann ich auch nicht ausschließen, dass das Problem auch mit dem Überschreiben von paint (statt paintComponent) zu tun haben könnte, aber das ist nur Spekulation.


----------



## irgendjemand (14. Apr 2012)

könnte das problem nicht auch daran liegen das beim scrollen der inhalt des jpanel jedes mal mit neu gezeichnet wird anstatt das was einmal auf das jpanel gezeichnet wurde verschoben wird ? wäre jetzt auch mal so ne idee da was zu ändern ...

halt nur einmal das komplette jpanel zeichnen ... und dann nur den viewport verschieben ... anstatt bei jedem verschieben durch das überschreiben dieser methoden zu bewirken das das komplette jpanel bei jedem 5px scroll komplett neu gezeichnet wird *was ja vermutlich der performance-fresser ist*


----------



## CookieSoft (14. Apr 2012)

Du musst deine Map wenn es ein JPanel ist eine PrefferedSize setzen und dann ein neues JScrollPane erstellen und die JPanel Map zu dem JScrollPane hinzufügen. Hoffe du verstehst es!:bahnhof:
Ich bin mir nicht sicher aber in sowas in der Art:
:rtfm:
Bei der JFrame Klasse:

```
private Map deineMap (JPanel)
private JScrollPane jsp;
...
deineMap.setPreferredSize(new Dimension((2000, 4000)); //Werte ändern!

this.jsp = new JScrollPane(deineMap, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
this.jsp.setBounds(0, 0, Window.getWidth(), Window.getHeight() );

deinFensterJFrame.add(jsp); //Wichtig das JScollPane hinzufügen
```


----------

