Bewegtes Bild im ActionListener [Problem]

Highchiller

Bekanntes Mitglied
Ein wunderschönes Osterfest wünsch ich allen Usern. :meld:

Wir haben im Informatikkurs die Aufgabe gestellt bekommen ein Spiel zu programmieren.
In meinem Spiel geht es darum mit einer Kanone (links im Bild) eine andere Kanone (rechts) abzuschießen. Dazu lasse ich eine Kugel quer über den Bildschirm fliegen. :cool:

Ich habe also ein JFrame mit Layout(null) erstellt, damit ich jeder Komponente die absolute Position zuweisen kann. Das sollte den Leser aber nicht weiter stören. ???:L


Problematik:
Nun zum eigentlichen Problem. Wenn ich die Kugel quer über den Schirm (JFrame) fliegen lassen möchte, stellt dies überhaupt kein Problem dar. Eine wunderschöne Parabel bildet dieser kleine Code hier:
[JAVA=42] kugel.setBounds(60,400,30,30);
for(int i=60;i <= 700;i++){
double a = Math.PI*60/180;
double cos = Math.cos(a);
double tan = Math.tan(a);
double c = (9.81/2)*(((i-60)*(i-60))/(80*80*cos*cos))-(i-60)*tan+400;
int y = new Double(c).intValue();
kugel.setLocation(i,y);
try {
Thread.sleep(8);
}
catch(InterruptedException e) {
}
}[/code]

So fliegt die Kugel perfekt hinüber. :smoke:

Nun will ich natürlich vorher Parameter umstellen können. Dazu zählen Abschusswinkel und Abschussgeschwindigkeit. Diese beiden Parameter spreche ich in einem Extra Fenster an. In diesem Fenster befindet sich auch ein Button (go).
Sobald ich den drücke, soll die Kugel so schön über den Bildschirm fliegen wie oben schon beschrieben.

Nun hab ich folgendes Problem. Mein Code sieht bisher so aus
//Auszug, um den Blickpunkt auf die Problematik zu richten
//Vereinfachter Bewegungscode, um beim wesentlichen zu bleiben
[JAVA=42] go.addActionListener(new ActionListener(){
public void actionPerformed (ActionEvent e){
feu.setVisible(false);
kugel.setBounds(60,400,30,30);
for(int i = 60; i <=200; i++){
kugel.setLocation(i,400);
try{
Thread.sleep(10);
}
catch(InterruptedException b) {
}
}
}
});[/code]

Theoretisch müsste jetzt mit dem Betätigen des Buttons (1) das Fenster zum einstellen der Parameter verschwinden (Fenster feu) und (2) die Kugel über den Bildschirm fliegen.
(1) Funktioniert wunderbar. Nur leider ist die Kugel nicht zu sehen. ???:L Es ist zu erkennen das das Programm im hintergrund arbeitet, aber die Kugel erscheint ERST an der Endposition. Der eigentliche Flug ist also nicht zu sehen. :bahnhof:

:rtfm:
Das Problem:
Die Kugel fliegt quer über den Bildschirm, sobald ich diesen Code in einen ActionListener einbinde, fliegt die Kugel nicht mehr, sondern erscheint nach kurzer Zeit plötzlich an ihrer ENDposition.

;(
Ich hoffe mir kann jemand helfen, da ich nicht mal ansatzweise eine Ahnung habe woran das liegen könnte *grübel*

PS: Im übrigen sollte noch erwähnt werden, dass ich ein Anfänger bin. Also hoffe ich, das Problem löst sich ohne selbst Funktionen zu überschreiben (á la @override manier) :pfeif:

Vielen Dank im vorraus für die Hilfe.
Euer Highchiller ;)
 

André Uhres

Top Contributor
Um das Objekt zu verschieben, benutzen wir die Methode "Component#setLocation". Dieser Animationsvorgang muss in einem eigenen Thread geschehen. Eine einfache Möglichkeit, diesen Thread zu verwirklichen, besteht darin, einen "javax.swing.Timer" zu benutzen.
 

Highchiller

Bekanntes Mitglied
Danke für die Hilfe aber so ganz versteh ich das noch nicht.
Ich hab jetzt einen eigenen Thread, also meine Bewegung einfach in ein Event gesteckt.
[JAVA=42] final ActionListener flug = new ActionListener(){
public void actionPerformed(ActionEvent q){
bg.setDoubleBuffered(true);
kugel.setDoubleBuffered(true);

kugel.setBounds(60,400,30,30);
for(int i=60;i <= 700;i++){
double a = Math.PI*60/180;
double cos = Math.cos(a);
double tan = Math.tan(a);
double c = (9.81/2)*(((i-60)*(i-60))/(80*80*cos*cos))-(i-60)*tan+400;
int y = new Double(c).intValue();
kugel.setLocation(i,y);
try {
Thread.sleep(8);
}
catch(InterruptedException e) {
}
}
}
};[/code]

Und das lass ich jetzt wie folgt starten?
[JAVA=42] go.addActionListener(new ActionListener(){
public void actionPerformed (ActionEvent e){
feu.setVisible(false);
int delay = 1000;
new Timer(delay, flug).start();
}
});[/code]

Ich fürchte so ganz durchdrungen hab ich das noch nicht :noe:
 

André Uhres

Top Contributor
In actionPerformed machst du nur eine Aktion, also keine Schleife und kein sleep. Die Aktion muss nämlich blitzschnell ablaufen, sonst blockiert die GUI. Nach jeweils delay Millisekunden erfolgt der nächste Durchlauf, d.h. actionPerformed wird erneut aufgerufen.
 

Highchiller

Bekanntes Mitglied
Soweit alles verständlich... Aber wie krieg ich den Vorgang denn dann überhaupt abgebrochen? Wenn er nach delay millisekunden den vorgang immer wieder wiederholt, wo und wie bekomm ich dann eine Abbruchfunktion hin?
Vor allem, wenn er alles wiederholt (nach delay millisec.) wieso gibts dann die Funktion Timer.repeat(true) überhaupt? O.O

Wenn ich das geschnallt hab bekomm ichs hin ^^ Dann nerv ich auch nicht weiter *schmunzel*
 

André Uhres

Top Contributor
Den Timer kannst du unter einer ähnlichen Bedingung stoppen, wie deine obige for-Schleife, etwa so:
Java:
if(i >= 700){
    i = 0;
    timer.stop();
}
wobei "i" und "timer" in dem Fall Instanzvariablen sind, damit sie zwischen den einzelnen "actionPerformed"-Aufrufen erhalten bleiben.

Die "repeat" Eigenschaft ist normalerweise auf "true" eingestellt. Man könnte sie sinnvoll auf "repeat(false)" setzen, falls eine einmalige Aktion nach einem "initial delay" auszuführen ist.
 

Highchiller

Bekanntes Mitglied
Ok... also ich hab alles begriffen... und die Kugel fliegt auch wunderschön über den Bildschirm
Nur.... sie hört nicht auf zu fliegen XD

Timer.stop();
schön und gut, ich versteh nur nicht wohin damit...
Also kurz zur erklärung, mein Code sieht jetzt so aus:
[JAVA=42] final Timer timer = new Timer(4, new ActionListener(){
public void actionPerformed(ActionEvent q){
bg.setDoubleBuffered(true);
kugel.setDoubleBuffered(true);

kugel.setBounds(60,400,30,30);
double a = Math.PI*w/180;
double cos = Math.cos(a);
double tan = Math.tan(a);
double c = (9.81/2)*(((i-60)*(i-60))/(80*80*cos*cos))-(i-60)*tan+400;
int y = new Double(c).intValue();
kugel.setLocation(i,y);
i++;
}
});

go.addActionListener(new ActionListener(){
public void actionPerformed (ActionEvent e){
feu.setVisible(false);
timer.start();
}
});[/code]

So... jetzt ist die Frage WO setz ich timer.stop(); ein damit er auch aufhört?
Kannst du mir da nochmal helfen? Ich hab schon einiges Probiert... aber leider ohne erfolg... :(
 

Highchiller

Bekanntes Mitglied
Soweit war ich auch... Leider kommt da ne Fehlermeldung:
[JAVA=42] final Timer timer = new Timer(1, new ActionListener(){
public void actionPerformed(ActionEvent q){
bg.setDoubleBuffered(true);
kugel.setDoubleBuffered(true);

kugel.setBounds(60,400,30,30);
double a = Math.PI*w/180;
double cos = Math.cos(a);
double tan = Math.tan(a);
double c = (9.81/2)*(((i-60)*(i-60))/(90*90*cos*cos))-(i-60)*tan+400;
int y = new Double(c).intValue();
kugel.setLocation(i,y);
i++;
if (i > 700){
i = 0;
timer.stop();
}
}
});[/code]

Java:
bangbang.java:215:11: variable timer might not have been initialized
      timer.stop();
     ^
1 error
 

André Uhres

Top Contributor
variable timer might not have been initialized
timer.stop();
^
1 error[/code]
Darum habe ich oben vorgeschlagen, "timer" als Instanzvariable zu deklarieren (Datenfeld):
... wobei "i" und "timer" in dem Fall Instanzvariablen sind, damit sie zwischen den einzelnen "actionPerformed"-Aufrufen erhalten bleiben.
Java:
    private final Timer timer;
...
        timer = new Timer(1, new ActionListener() {
...
 
Zuletzt bearbeitet:

Highchiller

Bekanntes Mitglied
Achsoooooooo meintest du das...
das hab ich net so ganz verstanden

vielen dank ^^ ich könnt dich knutschen
Es funktioniert... Danke das du mich da durch gelotst hast und vor allem nicht die nerven verloren hast ^^
Vielen dank noch mal...

Problem gelöst
Euer HighChiller
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Bewegtes Objekt soll sich um eine Parallele bewegen Java Basics - Anfänger-Themen 0
U Bewegtes Objekt Java Basics - Anfänger-Themen 2
K JPanel Größe (Grenzen für bewegtes Objekt) Java Basics - Anfänger-Themen 5
B Best Practice Schaltfläche im Bild finden Java Basics - Anfänger-Themen 8
G JLabel <html> mit Bild innerhalb des Textes </html> Java Basics - Anfänger-Themen 4
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
B Bild per KeyListener drehen Java Basics - Anfänger-Themen 1
I Kamera anschließen / Bild machen / Live View / Externe Blitz Java Basics - Anfänger-Themen 19
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
I Datei (Bild) Drucken und wie Druckeinstellung speichern? Java Basics - Anfänger-Themen 3
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
H Artefact mit Bild erzeugen Java Basics - Anfänger-Themen 11
R UML-Bild (Erkennung ob static o. nicht) Java Basics - Anfänger-Themen 18
J Bild auf Hintergrundbild zeichnen Java Basics - Anfänger-Themen 5
krgewb Bild itextpdf Java Basics - Anfänger-Themen 2
C Bild in executable JAR File mitgeben Java Basics - Anfänger-Themen 5
VPChief Bild in JEditorPane Java Basics - Anfänger-Themen 9
B Warum bekomme ich kein Bild. Java Basics - Anfänger-Themen 10
S Bild einfügen // NEU Java Basics - Anfänger-Themen 12
N Bild drehen Java Basics - Anfänger-Themen 3
S Ein Bild mit dynamischer Quelle neuzeichnen Java Basics - Anfänger-Themen 12
N GLOOP Bild nicht ansichtbar Java Basics - Anfänger-Themen 5
M Bild in JFrame Java Basics - Anfänger-Themen 1
B Signatur erstellen - Bild ist nur weiß Java Basics - Anfänger-Themen 0
CptK Interface Bild rotieren Java Basics - Anfänger-Themen 17
CptK Interface Bild rotieren Java Basics - Anfänger-Themen 1
Anica Processing Animation Bild-Position ändern Java Basics - Anfänger-Themen 9
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
CptK Interface Curser durch Bild ersetzen & MouseListner Java Basics - Anfänger-Themen 2
M jTextPane Bild anzeigen Java Basics - Anfänger-Themen 6
CptK Bild beim betätigen eines JButtons Java Basics - Anfänger-Themen 6
S Bild über JButton legen Java Basics - Anfänger-Themen 3
B Bild mit Schrift befüllen / Anpassung bei Wortlänge Java Basics - Anfänger-Themen 2
D Google maps bild mit marker versehen Java Basics - Anfänger-Themen 12
D ImageView mit einfarbigem Bild fuellen Java Basics - Anfänger-Themen 3
it_is_all Bild-Pfad wird gefunden, nicht aber Textdatei-Pfad Java Basics - Anfänger-Themen 8
M Einzelne Pixel in einem Bild auslesen und bearbeiten Java Basics - Anfänger-Themen 1
M Bild wird von JFrame nicht geladen Java Basics - Anfänger-Themen 12
J Bild in Button einsetzen Java Basics - Anfänger-Themen 6
S button kommt durch bild Java Basics - Anfänger-Themen 13
M Ein Bild durch Objekterzeugung zeichnen Java Basics - Anfänger-Themen 5
B Greenscreen (grüner Hintergrund ersetzen mit Bild) Java Basics - Anfänger-Themen 49
K Interface Kein Bild im .jar-File Java Basics - Anfänger-Themen 15
S Bild in Jar-File mit ImageIO Java Basics - Anfänger-Themen 50
S Bild einfügen Java Basics - Anfänger-Themen 16
binop Bild anzeigen lassen Java Basics - Anfänger-Themen 2
D Bild zu Text Java Basics - Anfänger-Themen 4
I HTML Code in Bild (transparent) konvertieren Java Basics - Anfänger-Themen 0
I Watermark erstellen mit HTML in Bild? Java Basics - Anfänger-Themen 7
D Classpath Bild kann in .jar nicht geladen werden Java Basics - Anfänger-Themen 2
Anfänger2011 Bild programmieren?! Java Basics - Anfänger-Themen 3
8 Eigenes Bild in email einfügen Java Basics - Anfänger-Themen 1
K JTable Bild einfügen Java Basics - Anfänger-Themen 1
L BufferdImage schwarzes Bild nach zusammenfügen zweier Bilder Java Basics - Anfänger-Themen 8
S Bild in JOptionPane Java Basics - Anfänger-Themen 1
C Abfrage nach einem Bild im Array Java Basics - Anfänger-Themen 9
J Umgebungsvariable Programmfenster zeigt kein Bild an Java Basics - Anfänger-Themen 1
J Bild loopen Java Basics - Anfänger-Themen 6
M JFrame Bild einfügen Java Basics - Anfänger-Themen 3
S Bild bei Kontakt ändern Java Basics - Anfänger-Themen 2
C Erste Schritte Bild holen und speichern Java Basics - Anfänger-Themen 1
D Bild in Frame einfügen Java Basics - Anfänger-Themen 11
D Bild im Applet anzeigen Java Basics - Anfänger-Themen 3
F Bild in ein Runnable Jar File packen (eclipse) Java Basics - Anfänger-Themen 2
M Java-Applet: Bild einbinden (getImage) Java Basics - Anfänger-Themen 0
J Ganzes Bild Java Basics - Anfänger-Themen 4
T GUI anstatt Bild schwarzes Rechteck gespeichert Java Basics - Anfänger-Themen 0
A Bild verschwindet! Wieso?? Java Basics - Anfänger-Themen 2
I Bild aus Bereich laden Java Basics - Anfänger-Themen 3
P Bild in JFrame Titelleiste Java Basics - Anfänger-Themen 7
Y Nach Bild-Upload wird Bild nicht angezeigt Java Basics - Anfänger-Themen 1
M Button mit Bild und Text Java Basics - Anfänger-Themen 2
M JSP-Einfaches Bild anzeigen Java Basics - Anfänger-Themen 4
C Bild ins Frame laden und Objekte drüber legen Java Basics - Anfänger-Themen 1
Sogomn Bild will sich nicht skalieren lassen Java Basics - Anfänger-Themen 1
P Ein Bild für GUI (Java-Editor) Java Basics - Anfänger-Themen 4
D Bild für ein paar Sekunden einblenden und wieder ausblenden Java Basics - Anfänger-Themen 1
E Bild per Verzeichnis/JFileChooser auf JPanel laden Java Basics - Anfänger-Themen 13
S Bild auf eine Position rotieren?! Java Basics - Anfänger-Themen 4
P Bild bearbeiten Java Basics - Anfänger-Themen 9
Z Datenmatrix in Bild verwandeln Java Basics - Anfänger-Themen 4
C Bild verschwinden lassen Java Basics - Anfänger-Themen 7
S Bild Icon aus ID3Tag auslesen Java Basics - Anfänger-Themen 4
E Bild vom FileChooser aus via ImageIcon in DB schreiben Java Basics - Anfänger-Themen 16
D Bild zum Panel hinzufügen Java Basics - Anfänger-Themen 8
C Greenfoot: Bei Tastendruck und best. Wert Bild ändern Java Basics - Anfänger-Themen 2
O Auflösung einer Bild-Datei bekommen ohne sie herunterzuladen?? Java Basics - Anfänger-Themen 7
L Bild-Datein "zuschneiden" Java Basics - Anfänger-Themen 11
O DeviantArt-Bild Konverter: Fehler.. Java Basics - Anfänger-Themen 16
K Transparents Bild laden -> Fehlermeldung Java Basics - Anfänger-Themen 6
M Bild einbinden Java Basics - Anfänger-Themen 7
2 Bild auf JApplet zeichnen Java Basics - Anfänger-Themen 18
T Bild laden Java Basics - Anfänger-Themen 7
R Bild in GUI Java Basics - Anfänger-Themen 11
D Eclipse Juno zeigt Bild nicht bei Run Java Basics - Anfänger-Themen 3
Kenan89 Bild mit jar öffnen Java Basics - Anfänger-Themen 4
S Problem bei Bewegung von einem Bild! Java Basics - Anfänger-Themen 2
J Bild mit transparenter Farbe Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben