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