Warum funktioniert mein jscrollpane Ergebnis in der sonderbaren Farbe Aufrufe in java swing?

StackOverflow https://stackoverflow.com/questions/566711

Frage

Ich habe eine routine, die den Farben eine wahnsinnig großen graph im inneren ein scroll-Bereich.Es ist zu groß, zu malen, vor der Zugabe zu der scrollpane - die menory Anforderungen wären einige gigs.

Aufgrund der Größe der Grafik bin ich-rendering des Diagramms innerhalb der paint-Methode des scrollpane-Kind.Das funktioniert gut, aber ich bin zu bemerken, dass jedes mal, wenn eine Bildlaufleiste verschoben wird meine Farbe routine wird zweimal - einmal mit clipping rect gleich den ungedeckten Bereich gescrollt und ein zweites mal mit der clipping rect gleich die viewport-Dimensionen.

Für Beispiel, wenn meine viewport 245x195 & ich scrollen Sie nach unten um 3 Pixel meine paint-routine aufgerufen wird, wird mit g.getClipBounds() wie folgt festgelegt:

java.awt.Rectangle[x=0,y=195,width=245,height=3]
java.awt.Rectangle[x=0,y=3,width=245,height=195]

...weil ich Rendern innerhalb der paint-routine, dies ist verursacht flackern (ich meine calcs so schnell wie ich kann, aber es ist ein bisschen eine Verzögerung, die ich denke).Fragen:

  1. Weiß jemand, wie man verhindern, dass der 2. Farbe nennen? Dies ist plain-jane JScrollPane Sachen, die ich hier mache - ich habe eine Komponente, die ich hinzufügen, um die scrollpane, füge ich die scrollpane zu einer übergeordneten Komponente.Sie können dieses Verhalten auch im ersten Bild scrollen demo @ das swing-tutorial.

  2. Wenn die Antwort auf #1 ist 'NÖ': kann jemand denken Sie an eine gute Möglichkeit, damit umzugehen ? Sollte ich Farbe, um eine Art von Bild-Puffer, track den letzten malen Anrufe und kopieren Sie das Bild, wo möglich ?Ich kann mir nicht vorstellen das es viel schneller als re-rendering, aber jeder Einblick geschätzt :-)

War es hilfreich?

Lösung

Hab ich lief in dieses Problem in der .NET-Welt.Die doppelte Pufferung, sollte Ihr problem lösen.

Wenn man das Rendern direkt auf eine Oberfläche, die auf dem Bildschirm angezeigt wird, haben Sie keine Kontrolle darüber, Wann die "zeigen" tatsächlich passiert.Was normalerweise passiert ist:Sie starten das rendering, die das noch nicht fertige Bild wird auf dem Bildschirm angezeigt wird, beenden Sie Rendern, und dann ist endlich auf dem Bildschirm angezeigt.

Wenn Sie beginnen, Ihre rendering-Logik durch das löschen einer Hintergrundfarbe, dann erscheinen diese wie ein Blitz.Doppelte Pufferung verhindert dies, denn es ist immer anzeigen aus eine abgeschlossen machen.Das Schlimmste, das passieren könnte, ist leichte 'reißen', aber das ist nur bemerkbar, in schnell wechselnden Animationen.

Selbst wenn Sie nur Rendern möchten Teil eines gigantischen Bild, können Sie immer noch verwenden diese Technik.Einfach wiedergeben, was Sie brauchen, auf einen off-screen-Oberfläche (dies ist die Größe der sichtbaren Teil, den Sie wollen).Und dann, wenn Sie fertig sind, ziehen Sie das gesamte Bild auf Ihre display Oberfläche auf einen Schlag.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top