"Animation" funktioniert nur bedingt.

Status
Nicht offen für weitere Antworten.

Kiola

Mitglied
Hey

Ich würde gerne mehrere Bilder schnell hintereinander zeichnen, nur leider funktioniert dies nur wenn ich NICHT "extends JPanel" mache. Doch das brauche ich in meinem Programm.
Habe mal zwei Testprogramme geschrieben:
Das hier funktioniert:

Code:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class AniFunktioniert extends JFrame{
	private BufferedImage h,eins,zwei;
	private BufferedImage feld[];
	
	public AniFunktioniert () {
		
		h=loadPics("hintergrund.jpg");
		eins=loadPics("1.png");
		zwei=loadPics("2.png");
		feld= new BufferedImage[2];
		feld[0]=eins;
		feld[1]=zwei;
		
		this.setPreferredSize(new Dimension(500,500));
		Dimension resolution = Toolkit.getDefaultToolkit().getScreenSize();
		this.setResizable(false);
		this.setLocation((resolution.width - this.getSize().width)/7, 
				(resolution.height - this.getSize().height)/7);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.pack();
		this.setVisible(true);	
		this.repaint();
	}

	
	private BufferedImage loadPics(String path){
		BufferedImage source = null;
		URL pic_url= getClass().getClassLoader().getResource(path);
		try {
			source = ImageIO.read(pic_url);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return source.getSubimage(0, 0, source.getWidth(), source.getHeight());
	}
	
	public void paint (Graphics g) {
		g.drawImage(h,0,0,this);
		aniZeichnen(g);
	}
	
	private void aniZeichnen(Graphics g) {
		for(int i = 0; i <2;i++){
			g.drawImage(feld[i],100,100,this);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		new AniFunktioniert();
	}
}


und das hier leider nicht =(

Code:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;


public class extendsJPanel extends JPanel{
	private JFrame frame;
	BufferedImage h,eins,zwei;
	BufferedImage feld[];

	public extendsJPanel () {

		h=loadPics("hintergrund.jpg");
		eins=loadPics("1.png");
		zwei=loadPics("2.png");
		feld= new BufferedImage[2];
		feld[0]=eins;
		feld[1]=zwei;
		
		feld= new BufferedImage[2];
		feld[0]=eins;
		feld[1]=zwei;
		this.setPreferredSize(new Dimension(500,500));
		Dimension resolution = Toolkit.getDefaultToolkit().getScreenSize();
		frame= new JFrame();
		frame.setResizable(false);
		frame.setLocation((resolution.width - frame.getSize().width)/7, 
				(resolution.height - frame.getSize().height)/7);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);	
		frame.repaint();
	}
	
	private BufferedImage loadPics(String path){
		BufferedImage source = null;
		URL pic_url= getClass().getClassLoader().getResource(path);
		try {
			source = ImageIO.read(pic_url);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return source.getSubimage(0, 0, source.getWidth(), source.getHeight());
	}
	
	public void paint (Graphics g) {
		g.drawImage(h,0,0,this);
		aniZeichnen(g);
	}
	
	private void aniZeichnen(Graphics g) {
		System.out.println("23");
		for(int i = 0; i <2;i++){
			g.drawImage(feld[i],100,100,this);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	public static void main(String[] args) {
		new extendsJPanel();
	}
}

kann mir jemand sagen woran das liegen könnte?

Danke schonmal im Voraus!
 

Quaxli

Top Contributor
Wunder mich, daß es überhaupt funktioniert. Ein paar Dinge die mir aufgefallen sind:

1. in den paint-Methoden fehlen die super-Aufrufe, also:

Code:
   public void paintComponent (Graphics g) {
      super.paintComponent(g);
      g.drawImage(h,0,0,this);
      //aniZeichnen(g);
   }

Mal abgesehen davon, daß man in Swing paintComponent überschreiben sollte.

2. Der Thread der die Animation startet sollte nicht aus der überschriebenen paintComponent-Methode gestartet werden.

3. mach nach dem Thread.sleep(..) mal einen repaint() - am Besten auf den ganzen Frame
 

Kiola

Mitglied
Also

habe die paint-Methode in die paintComponent umbenannt und den super-Aufruf gemacht.
Wo soll ich denn den Thread starten lassen?

frame.repaint() nach dem Thread.sleep macht das ganze leider nur noch schlimmer. Wenn ich jetzt das ganze Fenster bewege "verwischt" alles.

hier mein veränderter Code:

Code:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;


public class extendsJPanel extends JPanel{
	private JFrame frame;
	BufferedImage h,eins,zwei;
	BufferedImage feld[];

	public extendsJPanel () {

		h=loadPics("hintergrund.jpg");
		eins=loadPics("1.png");
		zwei=loadPics("2.png");
		feld= new BufferedImage[2];
		feld[0]=eins;
		feld[1]=zwei;
		feld= new BufferedImage[2];
		feld[0]=eins;
		feld[1]=zwei;
		this.setPreferredSize(new Dimension(500,500));
		Dimension resolution = Toolkit.getDefaultToolkit().getScreenSize();
		frame= new JFrame();
		frame.setResizable(false);
		frame.setLocation((resolution.width - frame.getSize().width)/7, 
				(resolution.height - frame.getSize().height)/7);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);	
		frame.repaint();
		
	}
	
	private BufferedImage loadPics(String path){
		BufferedImage source = null;
		URL pic_url= getClass().getClassLoader().getResource(path);
		try {
			source = ImageIO.read(pic_url);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return source.getSubimage(0, 0, source.getWidth(), source.getHeight());
	}
	
	public void paintComponent (Graphics g) {
		super.paintComponent(g);
		g.drawImage(h,0,0,this);
		aniZeichnen(g);
		
	}
	
	private void aniZeichnen(Graphics g) {
		for(int i = 0; i <2;i++){
			g.drawImage(feld[i],100,100,this);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
//			frame.repaint();
		}
		
	}
	public static void main(String[] args) {
		new extendsJPanel();
	}
}
 
S

SlaterB

Gast
> 2. Der Thread der die Animation startet sollte nicht aus der überschriebenen paintComponent-Methode gestartet werden.

bisher gibts ja noch gar keinen Thread ;)

mich wundert auch dass es beim JFrame geht,
halbwegs erlaubt wäre aber nur etwas in der Art von:

Code:
class ExtendsJPanel extends JPanel {
	private JFrame frame;
	BufferedImage h, eins, zwei;
	BufferedImage feld[];
	private int pictureToPaint = 1;

	public ExtendsJPanel() {

		h = loadPics("back.png");
		eins = loadPics("1.png");
		zwei = loadPics("2.png");
		feld = new BufferedImage[2];
		feld[0] = eins;
		feld[1] = zwei;

		this.setPreferredSize(new Dimension(500, 500));
		Dimension resolution = Toolkit.getDefaultToolkit().getScreenSize();
		frame = new JFrame();
		frame.setResizable(false);
		frame.setLocation((resolution.width - frame.getSize().width) / 7,
				(resolution.height - frame.getSize().height) / 7);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);
		aniZeichnen();
	}

	private BufferedImage loadPics(String path) {
		BufferedImage source = null;
		URL pic_url = getClass().getClassLoader().getResource(path);
		try {
			source = ImageIO.read(pic_url);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return source.getSubimage(0, 0, source.getWidth(), source.getHeight());
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(h, 0, 0, this);
		g.drawImage(feld[pictureToPaint], 100, 100, this);
	}

	private void aniZeichnen() {
		Runnable r = new Runnable() {
			public void run() {

				for (int i = 0; i < 12; i++) {
					System.out.println("i: " + i);
					pictureToPaint = (i % 2);
					try {
						Thread.sleep(400);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					repaint();
				}
			}
		};

		new Thread(r).start();
	}

	public static void main(String[] args) {
		new ExtendsJPanel();
	}
}

beim JFrame paint() zu überschreiben führt bei mir zu Flackern,
JPanel ist schon die richtige Ecke


------

edit:
da aniZeichnen() hier vom main-Thread aus ausgerufen wird, ginge es auch ohne neuen Thread,
Hauptsache, die GUI muss diese Aufgabe nicht übernehmen (aus paint oder aus einem ActionListener aufgerufen,
dann wäre ein neuer Thread nötig)
 

Kiola

Mitglied
hey danke!!
das funktioniert ja!!!
obwohl das mit dem Runnable usw kompliziert aussieht. Wäre ich niemals drauf gekommen..
 
S

SlaterB

Gast
viel wichtiger ist die Erkenntnis, dass die Schleife nur eine int-Variable setzt und dann repaint() aufruft,
ist allerdings auch oft mit einem Thread verbunden..
 

Kiola

Mitglied
meinst du mit dem "dass die Schleife nur eine int-Variable setzt", dass sie nicht an der stelle drawImage aufruft?
Ist das das Problem?
 
S

SlaterB

Gast
genau, denn entweder bedeutet das, dass die Schleife von paint() aus ausgeführt wird, was im Falle des JPanels dazu führt, dass nix angezeigt ist bis die Schleife und damit auch paint() fertig ist
(wieso es bei JFrame einigermaßen geht ist verwunderlich)

oder es bedeutet, dass parallel zu paint() noch jemand anders rummalt,
die beiden sich damit in die Quere kommen können, auch nicht schön
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Animation funktioniert icht wie sie soll Spiele- und Multimedia-Programmierung 10
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
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
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
R Double Buffering in Animation ich bekomms einfach nicht hin? Spiele- und Multimedia-Programmierung 3
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
P Pokemon Spiel Funktioniert nicht ? Spiele- und Multimedia-Programmierung 3
D MIDIdevice open funktioniert nicht Spiele- und Multimedia-Programmierung 1
A Kollision funktioniert nicht richtig bei zu schneller Geschwindigkeit des Spielers Spiele- und Multimedia-Programmierung 0
P Teamspeak interface mit JFrame funktioniert nicht Spiele- und Multimedia-Programmierung 3
D Kollision funktioniert unten aber nicht oben Spiele- und Multimedia-Programmierung 4
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
Damtonix Gameloop funktioniert nicht! Spiele- und Multimedia-Programmierung 6
temi libGDX Box2d ApplyTorque() funktioniert nicht Spiele- und Multimedia-Programmierung 1
M KeyListener funktioniert nicht während Timer läuft Spiele- und Multimedia-Programmierung 26
S KeyEvent funktioniert nicht, wenn Buttons dem Frame hinzugefügt werden Spiele- und Multimedia-Programmierung 7
C Export als .jar funktioniert nicht richtig (JAVA 3D) Spiele- und Multimedia-Programmierung 5
A Minecraft Minecraft, Programm funktioniert nur in Eclipse richtig Spiele- und Multimedia-Programmierung 24
F LWJGL: Licht und GL_LINES funktioniert nicht Spiele- und Multimedia-Programmierung 6
J KeyMapping funktioniert nicht Spiele- und Multimedia-Programmierung 5
J Sound einbinden funktioniert nicht Spiele- und Multimedia-Programmierung 13
D Slick Lib - Bilder einlesen funktioniert nicht Spiele- und Multimedia-Programmierung 2
M Mathetrainer - Reset Button funktioniert nicht! Spiele- und Multimedia-Programmierung 8
K Wie funktioniert hier ein Score ? Spiele- und Multimedia-Programmierung 4
O A* funktioniert, aber zu langsam Spiele- und Multimedia-Programmierung 10
D Highscoreliste eines Applets funktioniert online nicht Spiele- und Multimedia-Programmierung 4
StrikeTom KeyListener Funktioniert nicht Spiele- und Multimedia-Programmierung 3
aze Java 3D 1.5.2 auf Mac(Snow Leopard) funktioniert nicht mit Java SE 1.6 Spiele- und Multimedia-Programmierung 3
G Undo/Redo funktioniert nicht richtig Spiele- und Multimedia-Programmierung 2
Kidao Warum funktioniert hier keine Tastaturabfrage? Spiele- und Multimedia-Programmierung 6
S Sudoku Solver funktioniert beim 2. Aufruf nicht mehr Spiele- und Multimedia-Programmierung 11
R Kollisionserkennung funktioniert nicht Spiele- und Multimedia-Programmierung 3
R KeyListern funktioniert nicht. :S ? Spiele- und Multimedia-Programmierung 7
D Beispielprogram funktioniert nicht Spiele- und Multimedia-Programmierung 8
M Sonnensystem - Eigenrotation der Planeten funktioniert nicht Spiele- und Multimedia-Programmierung 4
M Wie funktioniert der RotPosPathInterpolator? Spiele- und Multimedia-Programmierung 5

Ähnliche Java Themen


Oben