# Double Buffering in Animation ich bekomms einfach nicht hin?



## rom4o (20. Mrz 2008)

Hallo Leute, ich habe mal versucht eine einfache Animation in Java zu programmieren.
Das Programm macht auch schon was es soll, aber leider flackern
die dargestellten Objekte.
Hab gelesen, dass man das mit Double Buffering weg bekommt.
Aber ich hab es einfach nicht geschafft das Programm so umzuschreiben, dass es funktioniert.
Hier mein funktionierendes Programm aber ohne DB.


```
import java.awt.*;//Graphics;
import javax.swing.*;//JFrame
import java.awt.event.*; 

import java.awt.event.WindowListener;
import java.awt.image.BufferedImage;
import java.util.Date; 

 public class Kreis_04Buff extends JFrame{

   // VARIABLEN
   private int posx;
   private Thread t;
   private boolean schalter1 = true;
   //Zeitvariablen
   int zahl = 0;
   int oldcent = 0;
   int Cent = 0;
   long zeit = 0;
   long refzeit = System.currentTimeMillis(); //Zeit zum Programmstart
   String Szeit = String.valueOf(zeit); 
   String Scent;
   String Susecent;
   // ------------
   
   public Kreis_04Buff(String newTitel) { // Konstruktormethode
      super.setTitle(newTitel);
   }

   
    public void start() {	//Hauptmethode
       t = new Thread(new Runnable(){
    	   public void run(){
       			while(true){
       				zeit = System.currentTimeMillis();
                    Szeit = String.valueOf(zeit-refzeit); 
       				Cent = cent(zeit,refzeit,oldcent);
                    oldcent = Cent;
       				Scent = String.valueOf(Cent);
       				Susecent = String.valueOf(usecent(Cent));
       				
                    //Steuerung des Kreises
       				if(posx==400){schalter1 = false;}
                    if(posx==-50){schalter1 = true;}
                    if(schalter1){posx++;}
       				 else{posx--;}
                   
                   try{ 
                	   
                	   Thread.sleep(20);
                	   repaint();
                   } catch(InterruptedException e){;} 
                }
       	  	}
       	  }
       	);
       
       t.start();
    }

//----------------------------------------------------------------------    
    
    public int cent(long a, long b,int c){
    	int d = (int) (a-b);
    	int temp = c;
    	if( (d%10) == 0){
    		temp++;
    	}
    	return temp;
    }
    
    public int usecent(int a){
    	int h = (a/100)+1;
    	if( (h%2) == 0){
    		return 100- (a-((h-1)*100)); //Absteigend
    	}
    	if( (h%1) == 0){
    		return a-((h-1)*100); //Aufsteigend
    	}
    	else return 0;
    }
    
//----------------------------------------------------------------------
    
    public static void main(String str[]) {	//MAIN
       Kreis_04Buff fenster = new Kreis_04Buff("Kreis_04Buff");
       fenster.setSize(500, 500);
       fenster.setLocation(300,100);
       fenster.setResizable( false );
       fenster.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); //beendet das Programm beim schließen des Fensters
     //Hinzufügen eines Labels
       UIDefaults uiDefaults = UIManager.getDefaults(); 
       uiDefaults.put( "Label.font",((Font)uiDefaults.get("Label.font")).deriveFont(15f) );
       JLabel l = new JLabel( "<html>Prototyp.

Wasserstandsfüllanzeige!!</html>",JLabel.LEFT ); 
//     l.setFont( new Font("Serif", Font.BOLD, 30) ); 
       l.setForeground( Color.BLUE );
       //l.setBackground(Color.BLACK);   //bringt nix???
       fenster.add( l );

       //Hinzufügen eines Buttons
/*       JButton b = new JButton( "Ende" ); 
       fenster.add( b );
       ActionListener al = new ActionListener() { 
    	      public void actionPerformed( ActionEvent e ) { 
    	        System.exit( 0 ); 
    	      } 
    	    }; 
    	b.addActionListener( al ); 
*/      
       
     //setze Fenster sichtbar
       fenster.setVisible(true);

       BufferedImage buffer = new BufferedImage (500,500,BufferedImage.TYPE_INT_RGB);
       
       
       fenster.start();	//Hauptmethode
    }

    public void paint(Graphics g) {	//Paintmethode
       super.paint(g);
       g.setColor(new Color(0, 0, 0));
       //g.drawOval(50+posx, 50, 100, 100);
       g.fillOval(50+posx, 50, 50, 50);
       g.fillRect(50+posx,50,1,1); //ein Punkt
       
       g.drawRect(199,199,101,201);
       g.drawString( "100%", 305, 205 );
       g.drawString( "0%", 312, 403 );
       g.drawString( Integer.toString(zahl), 380, 300 ); 
       g.drawString( Szeit + " ms", 350, 320 );
       g.drawString( Scent, 350, 340 );
       g.drawString( Susecent + " %", 350, 360 );
       g.setColor(Color.BLUE);
       g.fillRect(200,400-2*(usecent(Cent)),100,2*(usecent(Cent))); //jeweils y-Komponenten manipuliern
       //Wertebereich für (x,Y,x,y) 400>Y>200
       //repaint();
       
       
    }

 }
```

Vielleicht kann mir ja einer helfen????
Wäre euch sehr dankbar.

Mit freundlichen Grüssen rom4o


----------



## SlaterB (20. Mrz 2008)

> ich hab es einfach nicht geschafft das Programm so umzuschreiben

hast du denn schon irgendwas angefangen? ich sehe gar nix dazu,
weißt du überhaupt was das ist?
ist doch einfach gemacht


----------



## Marco13 (20. Mrz 2008)

Die paint-Methode von einem JFrame überschreiben ist ein bißchen heikel. Man sollte (IMHO IMMER) nur die paintComponent-Methode eines JPanels überschreiben, das im ContentPane des Frames liegt. 

Schnell um-gehackt:

```
// Von [url]http://www.java-forum.org/de/viewtopic.php?t=66294&highlight=[/url]

import java.awt.*;//Graphics;
import javax.swing.*;//JFrame
import java.awt.event.*;

import java.awt.event.WindowListener;
import java.awt.image.BufferedImage;
import java.util.Date;

public class Kreis_04Buff extends JPanel {

   // VARIABLEN
   private int posx;
   private Thread t;
   private boolean schalter1 = true;
   //Zeitvariablen
   int zahl = 0;
   int oldcent = 0;
   int Cent = 0;
   long zeit = 0;
   long refzeit = System.currentTimeMillis(); //Zeit zum Programmstart
   String Szeit = String.valueOf(zeit);
   String Scent;
   String Susecent;
   // ------------

   public Kreis_04Buff(String newTitel) { // Konstruktormethode
      //super.setTitle(newTitel);
   }


    public void start() {   //Hauptmethode
       t = new Thread(new Runnable(){
          public void run(){
                while(true){
                   zeit = System.currentTimeMillis();
                    Szeit = String.valueOf(zeit-refzeit);
                   Cent = cent(zeit,refzeit,oldcent);
                    oldcent = Cent;
                   Scent = String.valueOf(Cent);
                   Susecent = String.valueOf(usecent(Cent));

                    //Steuerung des Kreises
                   if(posx==400){schalter1 = false;}
                    if(posx==-50){schalter1 = true;}
                    if(schalter1){posx++;}
                    else{posx--;}

                   try{

                      Thread.sleep(20);
                      repaint();
                   } catch(InterruptedException e){;}
                }
               }
            }
          );

       t.start();
    }

//----------------------------------------------------------------------

    public int cent(long a, long b,int c){
       int d = (int) (a-b);
       int temp = c;
       if( (d%10) == 0){
          temp++;
       }
       return temp;
    }

    public int usecent(int a){
       int h = (a/100)+1;
       if( (h%2) == 0){
          return 100- (a-((h-1)*100)); //Absteigend
       }
       if( (h%1) == 0){
          return a-((h-1)*100); //Aufsteigend
       }
       else return 0;
    }

//----------------------------------------------------------------------

    public static void main(String str[]) {   //MAIN
       JFrame fenster = new JFrame("Kreis_04Buff");
       fenster.setSize(500, 500);
       fenster.setLocation(300,100);
       fenster.setResizable( false );
       fenster.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); //beendet das Programm beim schließen des Fensters
     //Hinzufügen eines Labels
       UIDefaults uiDefaults = UIManager.getDefaults();
       uiDefaults.put( "Label.font",((Font)uiDefaults.get("Label.font")).deriveFont(15f) );

       Kreis_04Buff kb = new Kreis_04Buff("");

       JLabel l = new JLabel( "<html>Prototyp.

Wasserstandsfüllanzeige!!</html>",JLabel.LEFT );
//     l.setFont( new Font("Serif", Font.BOLD, 30) );
       l.setForeground( Color.BLUE );
       //l.setBackground(Color.BLACK);   //bringt nix???
       kb.add( l );

       fenster.getContentPane().add(kb);

       //Hinzufügen eines Buttons
/*       JButton b = new JButton( "Ende" );
       fenster.add( b );
       ActionListener al = new ActionListener() {
             public void actionPerformed( ActionEvent e ) {
               System.exit( 0 );
             }
           };
       b.addActionListener( al );
*/

     //setze Fenster sichtbar
       fenster.setVisible(true);

       BufferedImage buffer = new BufferedImage (500,500,BufferedImage.TYPE_INT_RGB);


       kb.start();   //Hauptmethode
    }

    public void paintComponent(Graphics g) {   //Paintmethode
       super.paintComponent(g);
       g.setColor(new Color(0, 0, 0));
       //g.drawOval(50+posx, 50, 100, 100);
       g.fillOval(50+posx, 50, 50, 50);
       g.fillRect(50+posx,50,1,1); //ein Punkt

       g.drawRect(199,199,101,201);
       g.drawString( "100%", 305, 205 );
       g.drawString( "0%", 312, 403 );
       g.drawString( Integer.toString(zahl), 380, 300 );
       g.drawString( Szeit + " ms", 350, 320 );
       g.drawString( Scent, 350, 340 );
       g.drawString( Susecent + " %", 350, 360 );
       g.setColor(Color.BLUE);
       g.fillRect(200,400-2*(usecent(Cent)),100,2*(usecent(Cent))); //jeweils y-Komponenten manipuliern
       //Wertebereich für (x,Y,x,y) 400>Y>200
       //repaint();


    }

}
```


----------



## rom4o (20. Mrz 2008)

Hey super ich danke dir vielmals Marco das läuft ja jetzt super.
Und @ Slater, ich weiss was Double Buffering ist aber hab es ja wie
gesagt nicht umsetzen können.

Also vielen Dank euch beiden für die Mühe.

Viele Grüße

rom4o


----------

