W
wayne0101
Gast
hallo zusammen,
ich möchte eine kleine animation schreiben. da ich schon länger mit java programmiere und weiß, daß es doublebuffering gibt und das die grafik sonst flackert, habe ich mich durch diverse tutorials gehangelt, welche mir alle das selbst sagten. ich soll die update(Graphics) methode meiner Component überschreiben und darin ein offscreen-image anlegen. das sieht bei mir nun (vereinfacht) so aus:
so jedenfalls haben mir das alle tutorials suggeriert, daß dies funktioniert. dort steht überall zu lesen, daß laut der ursprünglichen implementierung durch meinen repaint()-aufruf dann zunächst beim neuzeichnen update(Graphics) aufgerufen wird, welches normalerweise den zeichenbereich mit der hintergrundfarbe übermalt und anschließend paint(Graphics) aufruft.
nur ist das bei mir leider nicht so. ich musste feststellen, daß, nach dem repaint() aufgerufen wurde, immer nur die paint(Graphics) methode direkt aufgerufen wird. update(Graphics) hingegen bleibt unberührt liegen und wird niemals aufgerufen. hab schon versucht das ganze mit anstatt von Panel von JPanel, von JComponent und von Component erben zu lassen. bei den Swing-Instanzen habe ich dann noch extra dazu versucht im konstruktor meiner klasse setDoubleBuffering(true) aufzurufen. alles ohne erfolg, aber mit viel flackern.
hat sich da was geändert bei java, daß das mit der 5er von java so nicht mehr funktioniert und die von mir studierten tutorials alle veraltet sind oder mach ich was verkehrt? zur not würd ich mir meine eigene UI-klasse schreiben, aber da würd ich dann doch noch gern drum herum kommen ... ist etwas viel aufwand für dieses problem.
vielen lieben dank
wayne[/code]
ich möchte eine kleine animation schreiben. da ich schon länger mit java programmiere und weiß, daß es doublebuffering gibt und das die grafik sonst flackert, habe ich mich durch diverse tutorials gehangelt, welche mir alle das selbst sagten. ich soll die update(Graphics) methode meiner Component überschreiben und darin ein offscreen-image anlegen. das sieht bei mir nun (vereinfacht) so aus:
Code:
class MyAnimation extends Panel implements Runnable {
private Image dbImage;
private Graphics dbGraphics;
private boolean isInterrupted;
public MyAnimation(){
super();
isInterrupted = false;
}
public void startAnimation(){
isInterrupted = false;
Thread thread = new Thread(this);
thread.start();
}
public void stopAnimation(){
isInterrupted = true;
}
public void run(){
while( !isInterrupted ){
repaint();
waitFor(40);
}
}
private synchronized void waitFor(long ms){
try {
wait(ms);
}
catch( Exception e ){
}
}
public void update(Graphics g){
if( dbImage == null ){
dbImage = createImage(getWidth(),getHeight());
dbGraphics = dbImage.getGraphics();
}
paint(dbGraphics);
g.drawImage(dbImage,0,0,null);
}
public void paint(Graphics g){
g.setColor(...);
g.drawLine(...);
// etc. etc. etc. ... nur zeichenoperationen auf g; nichts weiter
}
}
nur ist das bei mir leider nicht so. ich musste feststellen, daß, nach dem repaint() aufgerufen wurde, immer nur die paint(Graphics) methode direkt aufgerufen wird. update(Graphics) hingegen bleibt unberührt liegen und wird niemals aufgerufen. hab schon versucht das ganze mit anstatt von Panel von JPanel, von JComponent und von Component erben zu lassen. bei den Swing-Instanzen habe ich dann noch extra dazu versucht im konstruktor meiner klasse setDoubleBuffering(true) aufzurufen. alles ohne erfolg, aber mit viel flackern.
hat sich da was geändert bei java, daß das mit der 5er von java so nicht mehr funktioniert und die von mir studierten tutorials alle veraltet sind oder mach ich was verkehrt? zur not würd ich mir meine eigene UI-klasse schreiben, aber da würd ich dann doch noch gern drum herum kommen ... ist etwas viel aufwand für dieses problem.
vielen lieben dank
wayne[/code]