Animation "springt" trotz Wartebefehl

Haave

Top Contributor
Hallo,

bei Head First Java habe ich die Aufgabe, einen Kreis sich allmählich von einem Ort zum anderen bewegen zu lassen.
Bei meinem Code springt der Kreis beim Ausführen der Aktion jedoch sofort am Zielort, ohne dass er sich sichtbar dorthin bewegt hätte. Ich dachte mir, dass ich wohl irgendeinen Wartebefehl brauchen werde, damit nicht ohne Unterlass durch die Schleife gerannt wird. Die Lösung im Buch verwendet
Code:
Thread.sleep(50)
, um das ganze zu verlangsamen (offiziell eingeführt und erläutert werden Threads allerdings erst drei Kapitel später, ich konnte das also nicht wissen). Ich ergänzte den Code wie angegeben um die Zeilen:
[JAVA=38]try {
Thread.sleep(50);
} catch(Exception ex) {}[/code]
Aber nun wird beim Ausführen der Aktion erst gewartet und dann springt der Kreis doch wieder, statt sich wie gehofft langsam zum Zielort zu bewegen. Kann mir jemand sagen, woran das liegt?
Hier mal mein Code:

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyFrame extends JFrame implements ActionListener {
	public static void main(String[] args) {
		MyFrame f = new MyFrame();
	}
	
	static final String TITLE = "Fabulous Moving Circle Program";
	private int x = 20;
	private int y = 50;
	JButton b;
	MyDrawPanel p;
	
	public MyFrame() {
		super(TITLE);
		
		p = new MyDrawPanel();
		add(BorderLayout.CENTER, p);
		b = new JButton("Start!");
		b.addActionListener(this);
		add(BorderLayout.SOUTH, b);
		
		setSize(700, 600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
	
	public void actionPerformed(ActionEvent e) {
		paintIt();
	}
	
	public void paintIt() {
		for(int i = 0; i < 50; i++) {
			repaint();
			System.out.println(x+", "+y); //nur testweise eingebaut
			try {
				Thread.sleep(50);
			} catch(Exception ex) {}
			x += 5;
			y += 5;
		}
	}
	
	class MyDrawPanel extends JPanel {
		public void paintComponent(Graphics g) {
			g.setColor(Color.BLACK);
			g.fillRect(0, 0, this.getWidth(), this.getHeight());
			
			g.setColor(Color.WHITE);
			g.fillOval(x, y, 100, 100);
		}
	}
}
 

eRaaaa

Top Contributor
Kann mir jemand sagen, woran das liegt?

Ja, da du die Methode aus der actionPerformed heraus aufrufst, diese allerdings wiederum von dem GUI-Thread(EDT: der auch fürs Zeichen etc. zuständig ist) ausgeführt wird, legst du auch diesen mit Thread.sleep schlafen,d h. er kann dann natürlich auch nicht zeichnen und er zeichnet dann eben nur das Ende(denn dann ist er mit dem Schlafen fertig :D ) <-- grob gesagt !
Abhilfe bei so etwas schafft immer ein neuer Thread oder wenns direkt mit Swing und so Zeiten zu tun hat auch direkt der Swing_Timer!

How to Use Swing Timers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)
 

Schandro

Top Contributor
du darfst paintIt() nicht im EDT aufrufen, ansonsten legt sich der EDT selber schlafen und kann deswegen in der Schlafenszeit nicht malen.
new Thread(new Runnable(){public void run(){paintIt();}}).start();
statt einfach nur
paintIt();
 

Haave

Top Contributor
Ein Freund, der ganz ordentlich Ahnung von Java hat, erzählte mir mal (noch bevor ich mit GUI-Programmierung begann), dass das Schlafenlegen des Event Dispatcher Threads ein beliebter Anfängerfehler sei und sich der ahnungslose Anfänger dann wundere, warum das Programm so aussehe, als sei es eingefroren… Verdammt, und ich hatte gehofft, dass mir das NICHT passiert! ;(
Hätte ich das Programm mal so abgeschrieben, wie es im Buch steht, und nicht noch einen blöden Button eingebaut, bloß weil ich auf was draufdrücken wollte… Hab den grad mal gekillt und jetzt geht es :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C getSelectedRow() springt bei JButton-Auswahl nicht weiter mit Frameworks - Spring, Play, Blade, Vaadin & Co 16
G HILFE Dringend switch case springt nicht raus Frameworks - Spring, Play, Blade, Vaadin & Co 23
L Mauszeiger springt in obere linke Ecke des JDialogs Frameworks - Spring, Play, Blade, Vaadin & Co 3
D Button springt aus Textbox Frameworks - Spring, Play, Blade, Vaadin & Co 2
A Debugger springt in andere Klassen Frameworks - Spring, Play, Blade, Vaadin & Co 14
K Figur Springt nicht Frameworks - Spring, Play, Blade, Vaadin & Co 2
S Zeitmessung springt vorraus und funktioniert nicht! Frameworks - Spring, Play, Blade, Vaadin & Co 4
P Spieler im 2D-Spiel springt herum Frameworks - Spring, Play, Blade, Vaadin & Co 0
G JTable springt (JScrollPane, GridBagLayout) Frameworks - Spring, Play, Blade, Vaadin & Co 1
K TextWatcher springt nicht an Frameworks - Spring, Play, Blade, Vaadin & Co 9
T JTable + JScrollePane Größe "springt" beim resizen des Fensters Frameworks - Spring, Play, Blade, Vaadin & Co 4
engelsteufelin Taschenrechner springt an Start nach falscher Eingabe Frameworks - Spring, Play, Blade, Vaadin & Co 7
W Java Applet aus der Taskleiste springt in Vordergrund Frameworks - Spring, Play, Blade, Vaadin & Co 3
O Progressbar 'springt nicht an' Frameworks - Spring, Play, Blade, Vaadin & Co 5
B Exception springt nicht in den catch- Block Frameworks - Spring, Play, Blade, Vaadin & Co 14
R Programm springt nicht in if Bedingung Frameworks - Spring, Play, Blade, Vaadin & Co 9
F Debugging springt nicht in Methode - liefert null Frameworks - Spring, Play, Blade, Vaadin & Co 2
C LWUIT: Scrollen der Form springt am Ende Frameworks - Spring, Play, Blade, Vaadin & Co 0
J Eclipse springt nicht mehr an. Frameworks - Spring, Play, Blade, Vaadin & Co 8
nrg Debugger springt immer in Java SE Code Frameworks - Spring, Play, Blade, Vaadin & Co 3
D Methode springt zwischen returns Frameworks - Spring, Play, Blade, Vaadin & Co 2
Balbes JComboBox springt af den ersten Wert zurück Frameworks - Spring, Play, Blade, Vaadin & Co 6
Z JList "springt" Frameworks - Spring, Play, Blade, Vaadin & Co 5
R Keine Code Coverage trotz Validen Tests? Frameworks - Spring, Play, Blade, Vaadin & Co 1

Ähnliche Java Themen

Neue Themen


Oben