# Animation auf einem Hintergrundbild



## Marcel_Handball (17. Feb 2007)

Hallo zusammen,
ich sitze gerade an einem Projekt und möchte eine Animation auf einem Hintergrundbild laufen lassen.

Theoretisch kein Problem, aber wenn ich es folgendermaßen mache, flackert das bild die ganze zeit, da es ja immer wieder neu gezeichnet wird. (steht ja mit in der paint methode, die ja ununterbrochen aufgerufen wird).


```
import java.applet.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


public class gradnetz extends Applet implements Runnable, ActionListener
{   Thread myThread;
    Image bild;
    int y=5;

    public void init()
    {  
        bild = getImage( getDocumentBase(), "hinter.jpg" );
    }

    
    
    public void start(){
        if(myThread==null){myThread=new Thread(this); 
        myThread.start();}
    }
    
    
    public void run(){
        Thread thisThread = Thread.currentThread();
        
        while(myThread == thisThread){
            y++;
        
            repaint();
            try{myThread.sleep(20);}catch(InterruptedException e){}
            if(y==295){stop(); y=5; lauf=false; halt.setLabel("Weiter 1");}
        }
    }
    
    
    public void stop(){
        myThread = null;
    }
    
        
    public void paint(Graphics g){   
            g.drawImage( bild, 0, 0, this ); 
            g.setColor(Color.red);
            g.drawLine(5,y,200,y);               
   }
          
}
```

Wie kann ich also auf einem Bild zeichnen ohne, dass dieses flackert (kann man ein Hintergrundbild auch außerhalb der paint methode erzeugen? Es soll auf jeden fall nur einmal gezeichnet werden? 
Wie kann ich das umsetzen??

Schon im Voraus DANKE für eure Antwort.
Marcel


----------



## doctus (17. Feb 2007)

einfacher trick : Doppelpufferung.

s. hier: http://javacooperation.gmxhome.de/BildschirmflackernDeu.html

Um das Hintergrund bild zu zeichnen, brauchst du ein Graphics-Object. daher muss das in die paint()-methode.

lg doctus


----------



## Marcel_Handball (17. Feb 2007)

Boa, vielen vielen Dank für die schnelle Antwort.
Die "Tipps" von der URL haben wunderbar funktioniert !!!


----------



## VdA (17. Feb 2007)

doctus hat gesagt.:
			
		

> einfacher trick : Doppelpufferung.
> 
> Um das Hintergrund bild zu zeichnen, brauchst du ein Graphics-Object. daher muss das in die paint()-methode.
> 
> lg doctus



Warum :?: du kannst doch mit meinfenster.getGraphics() dir selbst ein Graphics objekt erzeugen


----------



## Wildcard (17. Feb 2007)

VdA hat gesagt.:
			
		

> Warum :?: du kannst doch mit meinfenster.getGraphics() dir selbst ein Graphics objekt erzeugen


Kann man, ist aber in 99,9% aller Fälle völlig verkehrt. Warum? Ich erklär das jetzt nicht zum hundertsten mal  :?


----------



## doctus (17. Feb 2007)

@VdA:

was hast du eigendlich mit deinem getGraphics()?^^

ich hab gerade schon nen thread gesehen, wo wildcard dir gesagt hat, das das nicht die optimale lösung ist.


----------



## Marco13 (18. Feb 2007)

Aber es ist sooo schön einfach, und funktioniert ja _meistens_ ... :wink:


----------



## VdA (19. Feb 2007)

aber warum ist es so schlecht?
Hab in nem malprogramm das angewendet damit wenn der User 
mit dem Stift rübermalt sofort zu sehen ist was er gezeichnet hat
und nicht erst nach dem nächsten repaint in x sekunden.


----------



## VdA (19. Feb 2007)

hat sich erledigt hab den Thread gefunden.


----------



## Roar (19. Feb 2007)

muss ja nen tolles malprogramm sein, was meine kunst nach dem nächsten resizen des fensters wieder verwirft :roll:

> und nicht erst nach dem nächsten repaint in x sekunden.
repaint(); ?


----------



## VdA (19. Feb 2007)

ich hole mir mit BufferedImage#getGraphics() das Graphics objekt von dem Papier wo man drauf zeichnen kann
und zeichne das dann auf das Fenster mit

```
this.getGraphics().drawImage(meinbild, 0, 0);
```
obwohl mir fällt ein das ich das Programm vllt noch Performanter machen könnte wenn ich das in paintComponent setze
und repaint() immer in mouseDragged() aufrufe mg
 aber ersma is mein PC im Arsch und bis der wieder heil is dauert das n bischen :x  

PS: hat mittlerweile was alle funktionen wie in MS Paint und noch ein paar mehr die ich in MS Paint vermisst hab


----------

