Kreis mit Klick auf dem Button bewegen lassen

Hallo Leute
ich habe erst vor kurzem angefangen Java zu lernen. Ich habe jetzt eine GUI mit 4 buttons (oben,unten,links,rechts) und einem Kreis in der Mitte. Nun möchte ich, dass wenn ich z.B. den rechten Button klicke, der Kreis nach rechts geht (Nicht springt!)
Hier ist mein Versuch:

import java.awt.*;
import java.awt.event.*;

public class snake {

int x = 10;
int y = 10;
int i = 0;
int g = 0;

zeichenpanel panel = new zeichenpanel();

public static void main (String[] args) {
snake go = new snake();
go.los();
}

public void los() {

JFrame frame = new JFrame();

JButton button1 = new JButton("Rechts");
JButton button2 = new JButton("Links");
JButton button3 = new JButton("Hoch");
JButton button4 = new JButton("Runter");

frame.add(BorderLayout.EAST, button1);
frame.add(BorderLayout.WEST, button2);
frame.add(BorderLayout.NORTH, button3);
frame.add(BorderLayout.SOUTH, button4);

frame.add(BorderLayout.CENTER, panel);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 800);
frame.setVisible(true);

button1.addActionListener(new rechts());
button2.addActionListener(new links());
button3.addActionListener(new hoch());
button4.addActionListener(new runter());
}

class rechts implements ActionListener {

public void actionPerformed(ActionEvent event) {
g = 0;
i = 1;
panel.renn();

}
}

class links implements ActionListener  {

public void actionPerformed(ActionEvent event) {
g = 0;
i = -1;
panel.renn();
}
}

class hoch implements ActionListener  {

public void actionPerformed(ActionEvent event) {
i = 0;
g = -1;
panel.renn();
}
}

class runter implements ActionListener  {

public void actionPerformed(ActionEvent event) {
i = 0;
g = 1;
panel.renn();
}
}

class zeichenpanel extends JPanel {

public void renn() {

for (int a = 0; a < 130; a++) {
x = x + i;
y = y + g;
panel.repaint();

try{
Thread.sleep(50);
} catch (Exception e) {}
}
}

public void paintComponent (Graphics g) {

g.setColor(Color.white);
g.fillRect(0,0,this.getWidth(), this.getHeight());

g.setColor(Color.green);
g.fillOval(x,y,40,40);
}
}
}```

Jedoch dauert es eine Weile und dann springt der Kreis zu seiner Endposition. Irgendwie werden die Zwischenschritte nicht angezeigt. Was mache ich falsch?

solange die renn()-Methode oder irgendwas anderes von einem ActionListener, also vom GUI-Thread, ununterbrochen ausgeführt wird,
kann die GUI nicht neu gezeichnet werden

du brauchst einen nebenläufigen Thread oder SwingWorker oder ähnliche Komponenten

ich bin jedes Mal neu erstaunt, wie schwer sich (für mich) ein guter Link dazu finden läßt,
aber hier zumindest ein überschaubares Testprogramm, je nachdem wie gut man TimerTask versteht
http://www.java-tips.org/java-se-tips/java.awt/how-to-create-animation-paint-and-thread.html

Thread allgemein für sich lernbar


eine Stufe höher mit einem nicht mal eben kurz gestarteten sondern dauerhaft nebenher laufenden Thread gibts im empfehlenswerte Tutorial
http://forum.byte-welt.net/threads/5049-Quaxli-s-Spiele-Tutorial
zu sehen

Danke für die tolle antwort :smiley:
Leider ist das noch zu hoch für mich ^.^
I mach einfach im buch weiter. Das war sowiso nur so ein Einfall von mir. :smiley: Denn im buch behandelt man animationen und events. Und da dachte ich, dass man beide doch einfach kombinieren könnte ^.^
Wie es aussieht dann doch nicht :smiley:

Animation ist ein Stichwort, das hat ja auch der eine Link von mir im Titel,
wie sieht denn dazu ein Testprogramm im Buch aus? irgendwas muss da auch richtig gemacht sein, halte dich irgendwie daran

ein Kapitel über Threads bietet sich grundsätzlich an wenn du gerade allgemein beim Lesen bist, etwa
http://openbook.galileocomputing.de/javainsel/javainsel_12_001.html

sobald dir bekannt ist dass Dinge nebeneinanderher passieren können ist das Problem hier simpel

Ja ich bin noch eher so „eins nach dem anderen“-prinzip drin ^.^
Jaja das im buch hab ich verstanden und es ist auch richtig. Nur wollte ich einfach mal mein wissen kombinieren ^.^ und habe eben das versucht. Das mit den Threads kommt später im buch vor :smiley: weiss allerdings nicht wieviel da steht. Werde wohl noch weiter lesen müssen :slight_smile: denn im moment ist das einzige was ich über Threads weiss der Befehl Thread.sleep(x);
Was ja auch nötig ist um die Animationsgeschwindigkeit zu bestimmen :smiley: