Mein erstes Programm flackert

Dauzo

Mitglied
Hallo liebe Forumleser,

ich habe ein Problem mit meinem ersten Programm, und zwar flackert es wenn ich es ausführe.

Quellcode:

Java:
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);
    }
}

Java:
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);
    }
}

Und noch eine zusätzliche Frage: Wie kann ich das Java Programm von Cmd ausführen? (Befehle)
 
Zuletzt bearbeitet von einem Moderator:
Sondern? Ich bin kein Java-Experte ich wüsste jetzt nicht wie ich den Quellcode umändern soll. Ich habe das ganze von einem Tutorial und bei ihm flackert das Bild nicht. Es wurde auch nicht erwähnt das es flackern könnte.
 
Also:
1) Bei Swingkomponenten überschreibt man in der Regel paintComponent(), und nicht paint()
2) In den Zeichenvorgang vom JFrame sollte man sich besser nicht einmischen. PingPong sollte besser von JPanel ableiten dass du dann als conentPane eines JFrames setzt.
3) Wie schon erwähnt solltest du nicht bei jedem neuzeichnen das Bild laden, das dauert. Lade dir das nur einmal, bspw. im Konstruktor und speicher dir das als Instanzvariable zwischen.
4) Verwende statt Toolkit#getImage besser ImageIO.
 
Sondern? Ich bin kein Java-Experte ich wüsste jetzt nicht wie ich den Quellcode umändern soll. Ich habe das ganze von einem Tutorial und bei ihm flackert das Bild nicht. Es wurde auch nicht erwähnt das es flackern könnte.

Ansonsten, auf das noch nicht geantwortet wurde:

1. Ein Bild läd man am besten so:

Java:
BufferedImage img;
String dateiName;
try
{
     img = ImageIO.read(getClass().getResourceAsStream(dateiName));
}
catch (IOException e)
{
     JOptionPane.showMessageDialog(null, dateiName + " wurde nicht gefunden!");
}

Also muss das vorher aufgerufen werden und dann muss in deiner paintComponent(Graphics g) das hier stehen:

Java:
public void paintComponent(Graphics gr) 
{
        super.paintComponent(gr);
        // Malen
        
        //Hintergrund
        gr.drawImage(img, 0, 0, this);
        
        //Ball
        ball.paintComponent(gr);
    }

genauso sollte in deiner paint methode in Ball nicht das hier stehen:

Java:
public void paint(Graphics gr) {
        gr.drawImage(Toolkit.getDefaultToolkit().getImage("images/ball.png"), x, y, comp);
    }

sonder wohl eher das hier:

Java:
public void paintComponent(Graphics gr) {
        gr.drawImage(img, x, y, comp);
    }
wobei
Code:
img
in dieser klasse natürlich eine separate variable sein muss und so wie oben initialisiert werden muss.

Und zum Aufruf einer Java Datei:

1. mit
Code:
cd\
in den richtigen ordner wechseln.
2. mit
Code:
javac (DATEINAME.java)
kompilieren
3. mit
Code:
java (DATEINAME)
ausführen

Ansonsten siehe Bild im Anhang.
 

Anhänge

  • CMDBeispiel.JPG
    CMDBeispiel.JPG
    23,6 KB · Aufrufe: 22
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben