Swing paint() update() Problem

Kostik

Grünschnabel
Hallo Leute,
zunächst eine kleine Absicherung falls meine Frage trivial ist: Ich bin ein Java-Anfänger.

ich habe ein Applet das von JApplet abgeleitet wird. In diesem Applet möchte ich eine Animation erstellen. Mein Problem ist jetzt, dass nach dem Aufruf von repaint() nicht die überschriebene Methode update() sondern paint() aufgerufen wird. Warum update() nicht aufgerufen wird, ist mir bekannt(denke ich), weil nämlich repaint() und paint() Methoden aus dem Packet java.awt.container sind und update() aus dem Packet javax.swing.JApplet ist. Somit wird die Update()-Methode aus dem Packet java.awt.container nach repaint() aufgerufen.
Ich habe auch schon versucht die Update()-Methode aus paint() herraus aufzurufen, aber das Ergebnis war nicht befriedigend.
Meine Frage:
Wie kann ich die richtige update()-Methode aufrufen, bzw. alle drei Methoden aus einem Packet aufrufen?

Danke im Voraus

Hier noch die vereinfachte Version meiner Animation:
Code:
import java.awt.*;
import javax.swing.*;

public class UpTestHaupt extends JApplet implements Runnable{
	
	// Variablen für die Doppelpufferung
	private Image dbImage;
	private Graphics dbg;

	private Thread th;
	private int x=0,y=0;
	
	public void init (){
		
	}
	
	public void start (){
		th = new Thread(this);
		th.start();
	}
	
	public void run(){
		while(x<100){
			x++;
			y++;
			repaint();
			try{Thread.sleep(50);}
			catch(Exception e){}
		}
		
	}
	public void paint (Graphics g){
		g.drawOval(x, y, 80, 80);
	}
	
	public void update (Graphics g)
	{	
		// Initialisierung des DoubleBuffers
		if (dbImage == null)
		{
			dbImage = createImage (this.getSize().width, this.getSize().height);
			dbg = dbImage.getGraphics ();
		}

		// Bildschirm im Hintergrund löschen
		dbg.setColor (getBackground ());
		dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

		// Auf gelöschten Hintergrund Vordergrund zeichnen
		dbg.setColor (getForeground());
		paint (dbg);

		// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
		g.drawImage (dbImage, 0, 0, this);
	}
 
Meiner Meinung nach müssen alle Zeichenoperationen in die paint-Methode. Die update-Methode solltest Du nicht überschreiben, die ruft im Normalfall nur paint() auf.

Java:
	public void paint (Graphics g)
	{	
		// Initialisierung des DoubleBuffers
		if (dbImage == null)
		{
			dbImage = createImage (this.getSize().width, this.getSize().height);
			dbg = dbImage.getGraphics ();
		}

		// Bildschirm im Hintergrund löschen
		dbg.setColor (getBackground ());
		dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

		// Auf gelöschten Hintergrund Vordergrund zeichnen
		dbg.setColor (getForeground());
		gbg.drawOval(x, y, 80, 80);

		// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
		g.drawImage (dbImage, 0, 0, this);
	}
 
Danke für die Antwort.
Das Problem ist, das ich eine Animation erstellen möchte, die nicht flackert. Deshalb verwende ich die Doppelpufferung, die das Flackern verhindert. Die Doppelpufferung sollte in meinem Fall in der Methode update() implementiert werden. Die Animation des Kreises war ein sehr einfache Reduzierung meiner Animation. Ich erstelle ein Applet in dem ein AVL-Baum generiert wird.
Als Lösung verwende ich ein ähnliches Konzept der repaint()-->update()-->paint(), und zwar repaint()-->paint()-->paintC(). Wobei paint() das Flackern verhindert und die Methode paintC() einzelne Grafik-Objekte zeichnet. Das ist meiner Meinung nach nicht die eleganteste Lösung, aber eine bessere habe ich im Moment nicht. Wenn einer eine bessere Lösung hat, bitte um Antwort. Danke!!
 
Hallo Kostik,
seit Java 1.3 (wenn ich nmich nicht irre) ist es sinnvoller die paint()-Methode nicht zu überschreiben. Stattdessen ist die paintComponent-Routine angesagt. soweit ich weiß wird dabei schon doppelt gepuffert, so man es nicht irgendwo ausschaltet.

probiers einfach mal so, und sag ob es geklappt hat.

Takidoso

Nachtrag: Habe gerade festgestellt, dass es bei Applets die paintComponent-Routine nicht gibt, da es offenbar "nur" ein Container und kein "JComponent" ist.
Sorry da lag ich oben offenbar nicht so ganz richtig mit meinem Tip. Aber vielleicht kannst Du ja Deine Grafik in eine JComponent (ich verwende immer JPanel) legen, welches dann im Applet eingefügt wird.

Viel Glück :-)
 
Zuletzt bearbeitet:
Zurück