Programm flackert

Dauzo

Grünschnabel
Hallo ich habe ein Problem und zwar flackert mein Programm wenn ich es ausführe.
Ich benutze Windows 7 32-Bit. (Beide Quellcode gehören zueinander)

Quellcode:

Code:
package pingpong;

import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

/**
 *
 * @author pmeier
 */
public class PingPong extends JFrame implements Runnable {
    
    private Ball ball = new Ball(100, 150, this);
    
    public PingPong(String title) {
        super(title);
    }
    @Override
    public void paint(Graphics gr) {
        super.paint(gr);
        // Malen
        
        //Hintergrund
        gr.drawImage(Toolkit.getDefaultToolkit().getImage("images/background.png"), 0, 0, this);
        
        //Ball
        ball.paint(gr);
    }
    
    @Override
    public void run() {
        while(true) {
            //Code
            
            //Ball
            ball.moveBall();
            
            //Code
            repaint();
            try {
                Thread.sleep(20);
            } catch (InterruptedException ex) {
                Logger.getLogger(PingPong.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public static void main(String[] args) {
        PingPong ping = new PingPong("Mein super cooles Spiel!");
        new Thread(ping).start();
        ping.setSize(800, 500);
        ping.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ping.setVisible(true);
    }
}

Quellcode (Ball):

Code:
package pingpong;

import java.awt.Component;
import java.awt.*;

/**
 *
 * @author pmeier
 */
public class Ball {
    
    private int x, y;
    private int velocityX, velocityY;
    private Component comp;
    
    public Ball(int x, int y, Component comp) {
        this.x = x;
        this.y = y;
        this.comp = comp;
        this.velocityX = 5;
        this.velocityY = 5;
    }
    
    public int getX() {
        return x;
    }
    
    public int getY() {
        return y;
    }
    
    public void moveBall() {
        if(x + 50 > 800) {
            velocityX = -5;
        }else if(x < 0) {
            velocityX = 5;
        }
        
        if(y + 50 > 500) {
            velocityY = -5;
        }else if(y < 0) {
            velocityY = 5;
        }
        
        x += velocityX;
        y += velocityY;
    }
    
    public void paint(Graphics gr) {
        gr.drawImage(Toolkit.getDefaultToolkit().getImage("images/ball.png"), x, y, comp);
    }
}
 
Hi,

bei Animationen arbeitet man mit dem sogenannten DoubleBuffering:
http://www.tutorials.de/swing-java2...er-pufferung-von-animationen.html#post1878689

Bei JPanel ist das ziemlich einfach, hier kann man das einfach einschalten:
Java:
public class Board extends JPanel{

 public Board() {
   setDoubleBuffered(true);
 }

}

Die paint Methode des JPanel macht dann ein automatisches DoubleBuffering. Da Du JFrame benutzt, musst Du wahrscheinlich mit einer BufferStrategy arbeiten. Das hier sollte Dir helfen einen entsprechenden Puffer zu implementieren:
http://content.gpwiki.org/index.php/Java:Tutorials:Double_Buffering

Gruß,
OneOf6
 
Und noch etwas: Zeichne doch nicht direkt in den JFrame, sondern in sein JContentPane. Und wenn du schon Swing verwendest, dann solltest du auf gar keinen Fall paint(), sondern paintComponent() aufrufen – außer du weist ganz genau was du tust! Swing sollte das doublebuffering für dich übernehmen, wenn du das so weit umsetzt, brauchst du dich nicht darum zu kümmern.

EDIT: Ein paar Grundlagen dazu gibts unter http://www.oracle.com/technetwork/java/painting-140037.html#swing
 
Zuletzt bearbeitet:
Zurück