Flimmerfreie Anzeige bei Mehrfachaufruf von paint(Graphics g)
uepselon
- java
Hallo,
ich bin gerade dabei eine kleine Java Anwendung zu erstellen.
In der Methode paint(...) wird ein Image als Hintergrund gezeichnet und darüber einge kleinere Images.
Die kleinen Bilder können mit der Maus verschoben werden, nun das Problem: Ansich klappt das Verschieben auch ganz gut, nur muss jedesmal die Methode repaint() aufgerufen werden um die Darstellung Aufrecht zu erhalten. Was unweigerlich dazu führt, das die ganze Anwendung zu flackern anfängt wenn mit der Maus ein Bild verschoben wird. Gibt es eine bessere Möglichkeit, sowas zu realisieren?
Hier nochmal mein aktuelles Schema:
public void paint(Graphic g)
{
g.drawImage(Hintergrund...)
g.drawImage(Kleines Bild1, Bild1X, .....)
g.drawImage(Kleines Bild2, Bild2X, .....)
}
public void mouseDragged(MouseEvent e)
{
Bild...X = e.getX();
Bild...Y = e.getY();
repaint();
}
Wie gesagt das ganze flackert einfach zu stark.
Gruß
ueps
Hallo uepselon,
[..] nur muss jedesmal die Methode repaint() aufgerufen werden um die Darstellung Aufrecht zu erhalten. Was unweigerlich dazu führt, das die ganze Anwendung zu flackern anfängt wenn mit der Maus ein Bild verschoben wird. Gibt es eine bessere Möglichkeit, sowas zu realisieren?
Die Methode "repaint()" ruft nicht etwa die Methode "paint()" auf, sondern
die Methode "update()". Und in "update()" passiert grob beschrieben folgendes:
public void update(Graphics g) {
g.clearRect(0, 0, width, height);
paint(g);
}
Es wird also zuerst der Zeichenbereich vollständig mit der Hintergrundfarbe
übermalt und dann erst paint() aufgerufen. Durch das Übermalen mit der
Hintergrundfarbe entsteht das Flackern. Die Abhilfe besteht ganz einfach
darin, daß du die Methode "update()" überschreibst und darin nur "paint(g)"
aufrust. Also etwa so:
public void update(Graphics g) {
paint(g);
}
Und schon müßte das Flackern verschwunden sein.
Natürlich mußt du dich dann selbst drum kümmern, falls irgendwelche Teile
der Zeichenfläche gelöscht werden müssen. Das scheinst du ja aber schon zu
tun, da du jedesmal den Hintergrund komplett neu zeichnest.
Gruß
Slyh
Hi Slyh,
public void update(Graphics g) {
paint(g);
}
Und schon müßte das Flackern verschwunden sein.
Danke, dass hat mir sehr weitergeholfen.
Gruß
ueps
bevor du repaint aufrufst, zeichne deine 3 images in eine art offscreen image.
Image showi;
Graphics showg;
showi = createImage(30, 30);
/*mit getSize().width etc lannst du erst arbeiten, wenn die componente dargestellt wurde und die groesse auch bekannt ist.*/
showg = showi.getGraphics();
showg.drawImage(Hintergrund...);
showg.drawImage(Kleines Bild1, Bild1X, .....);
showg.drawImage(Kleines Bild2, Bild2X, .....);
repaint();
public void update(Graphics g) {
g.drawImage(showi, 0, 0, this);
}
damit muss er nur noch ein bild zeichnen und das flakern sollte aufhoeren
Hallo,
bevor du repaint aufrufst, zeichne deine 3 images in eine art offscreen image.
damit muss er nur noch ein bild zeichnen und das flakern sollte aufhoeren
Stimmt, das habe ich bei meiner Antwort noch vergessen zu erwähnen.
Eine Mischung aus unseren beiden Antworten führt also zur richtigen Lösung. :-)
Gruß
Slyh
Hi,
Stimmt, das habe ich bei meiner Antwort noch vergessen zu erwähnen.
Eine Mischung aus unseren beiden Antworten führt also zur richtigen Lösung. :-)
Danke euch beiden, jetzt funktioniert alles prächtig!
Gruß
ueps