Double Buffering in Animation ich bekomms einfach nicht hin?

Status
Nicht offen für weitere Antworten.

rom4o

Mitglied
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.

Code:
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
 
S

SlaterB

Gast
> 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

Top Contributor
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:
Code:
// 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

Mitglied
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Double Buffering angewendet? Spiele- und Multimedia-Programmierung 10
F bildpositionierung mit double precision Spiele- und Multimedia-Programmierung 2
R Polygon um double x/y - Werte verschieben Spiele- und Multimedia-Programmierung 2
Developer_X Z-Buffering, ok, aber was ist mit X-Buffering und Y-Buffering? Spiele- und Multimedia-Programmierung 46
J buffering Spiele- und Multimedia-Programmierung 2
H Minecraft Casino EinarmigerBandit Animation Spiele- und Multimedia-Programmierung 5
B Animation Spiele- und Multimedia-Programmierung 4
Meeresgott Morph Targets und Skeleton Animation Spiele- und Multimedia-Programmierung 2
J (Libgdx) animation nur einmal in einem Event aufrufen Spiele- und Multimedia-Programmierung 1
N Animation funktioniert icht wie sie soll Spiele- und Multimedia-Programmierung 10
K Animation fliegendes JLabel Spiele- und Multimedia-Programmierung 1
R [LWJGL] Skeletal Animation Spiele- und Multimedia-Programmierung 5
F [LWJGL] Skeletal Animation 3D Spiele- und Multimedia-Programmierung 1
R Animation mit Interpolator starten wenn Key pressed Spiele- und Multimedia-Programmierung 0
kaoZ Animation in eigenen Thread auslagern..... Spiele- und Multimedia-Programmierung 1
S Animation zieht "Spur" hinter sich her Spiele- und Multimedia-Programmierung 2
H [ANIMATION] Hintergrundbild nur einmal zeichnen Spiele- und Multimedia-Programmierung 3
A LwJGL - Animation Stockt Spiele- und Multimedia-Programmierung 5
0 Sprung Animation Spiele- und Multimedia-Programmierung 10
M [Java3D] Animation von mehreren Objekten Spiele- und Multimedia-Programmierung 7
C Java3D Interaktion während Animation Spiele- und Multimedia-Programmierung 3
StrikeTom .gif animation als image abspielen Spiele- und Multimedia-Programmierung 2
G [Java3D] Probleme bei Animation Spiele- und Multimedia-Programmierung 4
baddestpoet Animation startet bei gedrückter Taste immer wieder von vorn Spiele- und Multimedia-Programmierung 12
M Animation Spiele- und Multimedia-Programmierung 5
aze Animation an TransformGroup anpassen Spiele- und Multimedia-Programmierung 5
S Animation mit repaint Spiele- und Multimedia-Programmierung 2
K "Animation" funktioniert nur bedingt. Spiele- und Multimedia-Programmierung 8
W Flüssige Animation Spiele- und Multimedia-Programmierung 8
B Animation durch Button auslösen Spiele- und Multimedia-Programmierung 2
J Animation hinter transparentem Bild auf der GlassPane Spiele- und Multimedia-Programmierung 6
D Problem mit Animation bei Little Fighter Spiele- und Multimedia-Programmierung 5
G GL4Java Animation erstellen Spiele- und Multimedia-Programmierung 2
T Geschwindigkeit einer Animation aendern Spiele- und Multimedia-Programmierung 6
S 3ds animation einbinden Spiele- und Multimedia-Programmierung 3
A Animation mit jmonkeyengine Spiele- und Multimedia-Programmierung 10
S Gif Animation aus Prog heraus erstellen Spiele- und Multimedia-Programmierung 11

Ähnliche Java Themen


Oben