Thread.sleep() in einer methode fürs zeichen

Skad

Mitglied
Hi,

meine Frage ist bezüglich eines Threads. Ich habe hierzu ein Dummy-Programm geschrieben:

Mein Frame mit main:

Java:
import java.awt.Dimension;
import javax.swing.JFrame;

public class GameFrame extends JFrame 
{
	GamePanel gp;
	
	public GameFrame()
	{
		gp = new GamePanel();
		add(gp);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setSize(new Dimension(1000,800));
		setResizable(false);
		
		repaint();
	}
	
	public static void main(String[] args) 
	{
	    GameFrame GF = new GameFrame();
	    GF.setVisible(true);
	}
	
}

Mein Panel:

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.*;
import javax.swing.*;

public class GamePanel extends JPanel 
{
	Figur f;
	
	
	public GamePanel()
	{
		setPreferredSize(new Dimension(300,300));
	    setBackground(Color.green);
	    f = new Figur();

	    repaint();
	}
	
	 public void paintComponent(Graphics g) 
	 {
	        super.paintComponent(g);
	        
	        f.laufen(g);

	 }
}

und noch eine Klasse fürs malen:

Java:
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.io.File;
import javax.imageio.ImageIO;
import java.util.ArrayList;

public class Figur 
{
		
	public void laufen(Graphics g)
	{
		
		String r1 = "D:/Java/pics/pic1.gif";
		String r2 = "D:/Java/pics/pic2.gif";
		String r3 = "D:/Java/pics/pic3.gif";
		
		
		Image img1;
		Image img2;
		Image img3;
		Image curImg;
		
		ArrayList<Image> cont = new ArrayList();
		
		try
		{
			cont.clear();
			
			img1 = ImageIO.read(new File(r1));
			cont.add(img1);;

			img2 = ImageIO.read(new File(r2));
			cont.add(img2);
			
			img3 = ImageIO.read(new File(r3));
			cont.add(img3);
			
			
			for(int j = 0; j < 10; j++)
			{
				for (int i = 0; i < 3; i++)
				{
//					try
//					{
//						Thread.sleep(500);
//				
//					}catch(InterruptedException e){System.out.println("Hier!");}
					
					curImg = cont.get(i);
					g.drawImage(curImg,40 + 50* j,50 +50 * j,null);
				}
			}
		}	catch (IOException e) {System.out.println("Image nicht da");}
	}
}


So wie es jetzt ist, funktioniert alles.

Wenn ich in der Klasse Figur die auskommentierte Zeilen 44-48 hinzufüge, macht mein Programm nichts mehr, oder besser gesagt Panel + Frame wird erzeugt, aber nix gemalt.
Ich möchte jedoch, die Bilder nacheinander malen mit einer Pause von 500 Millisekunden.

Ich habe im Internet gestöbert und auch andere Sachen probiert, wie z.B.
Thread t = new Thread();
t.start();
t.sleep(500);
usw. Langsam glaube ich, dass es an was anderem liegt.

Was mache ich flasch?
Kann mir bitte jemand sagen, wie das geht, dass das Porgramm den nächsten Schleifendurchgang in x Millisekunden machen soll?

Danke schon mal im voraus
 
Das Problem ist, dass die Änderungen erst sichtbar werden, wenn paintComponent komplett fertig ist.
D.h. du musst aus einem eigenem Thread heraus regelmäßig repaint aufrufen und jedesmal das Bild ein wenig versetzt zeichnen.
Diese Aufrufe kannst du dann z.B. alle 500ms machen mit Hilfe von Thread.sleep(500).
 
Ausserdem sollte die paintComponent Methode und alles was darin aufgerufen wird f.laufen() so kurz wie moeglich gehalten werden, ansonsten kann dein GUI blockieren und du wirst weder deine Figur steueren noch das Fenster schliesen koennen. Alle GUI/Event operationen werden von Java (sequenziel) im Event-Thread ausgefuehrt. Ist dieser mit einem Sleep oder andern langwierigen Operationen beschaeftigt kann er nicht auf deine Eingaben reagieren.

Du solltest deshalb auf komplexe Methoden wie das Laden von Images in der paintComponent Methode verzichten. Die Images lassen sich ja ohne Probleme einmalig im Konstruktor laden.
 
Vielen Dank.
Ich werde das mal heute abend, wenn ich es noch schaffe, ansonsten morgen ausprobieren.
Wenns dann klappt markier ich den Thread dann als erledigt, ansonsten frage ich nochmal nach.
 

Neue Themen


Zurück
Oben