Actionlistener funktioniert nicht "ordnungsgemäß"

Ok, dann war es wohl zu krass formuliert. Es ist nicht garantiert, dass es wahr wird. Dachte es wäre immer so.

Nur kurz als Beispiel:
Java:
String x = "Schwert";
String y = "Schwer";
String z = "t";

//false
System.out.println(x == (y+z));
//true
System.out.println(x.equals(y+z));
 
ok
es ist aber immer noch nicht geklärt, warum keine neuen Bilder gezeichnet werden, sondern nur die koordinaten erstellt werden, wenn ich ein neues objekt mit dem actionlistner erstelle!?
kann mir da noch jemand helfen?
 
Das mit dem repaint hast du drin?

Jedes Mal, wenn das Schwert ein Stück weiterrückt, muss es ja neu gezeichnet werden.
Bei dir sind alle Zeichendurchgänge bis zur Zielposition in einer Schleife durch in einer einzigen Funktion, die im Actionlistener aufgerufen wird.

Das Problem hier ist:
Im Hintergrund läuft von Java aus ja ein Framework mit (Ist im Gegensatz zu zB C eigentlich das Grundprinzip von Java), dass zB wenn du einen Button erstellst dafür da ist, dass der Button gezeichnet wird, ohne dass du in deinem jeden einzelnen Strich selber extra zeichnen musst; und die Ausgabe zum Bildschirm etc übernimmt.

Wenn jetzt ein Button gedrückt wird, läuft das zuerst auch zum Framework, das dann von sich aus weiter deinen Actionlistener aufruft.

Und eben das ist das Problem.
Das Framework ruft deinen Actionlistener als eine normale Methode auf und macht erst dann mit seiner eigenen Arbeit weiter, wenn dein Actionlistener fertig ist.
Du zeichnest im Actionlistener das erste Mal ein Schwert-gut, ab in die Warteschlange damit.
Zweites mal ein wenig verschoben zeichnen-ab in die Warteschlange.

Wenn das Framework gleichzeitig zu deiner Funktion weiterarbeiten würde, würde es das ganze auch auf den Bildschirm zeichnen.
So wird aber erst weitergemacht, wenn dein Schwert bis zur letzten Position weitergerückt und und zum Zeichnen gegeben worden ist, und dein Actionlistener somit fertig ist.

Das ganze kannst du mit einem Thread lösen.
Ist quasi eine Methode, um mehrere verschiedene Sachen gleichzeitig nebeneinander laufen zu lassen.

Dafür:
1) Rufst du in der Klasse Schwert die Methode move nicht gleich im Konstruktor auf.
2) implementierst für Schwert das Interface Runnable
3) schreibst in Schwert noch eine Methode run, die in sich move aufruft
4) und verwendest den Actionlistener nur noch, um das Schwert zu "starten"
 
Danke erstmal für diese Antwort!
Mit Thread bin ich noch nicht so oft in berührung gekommen deshalb hätte ich eine Bitte:
Kannst du mir vieleicht ein konkretes Code beispiel geben?

mit vielem Dank
Martin
 
Findet man haufenweise in Google.

zB Hier: http://www.go4expert.com/forums/showthread.php?t=4202

Also:
1) In der Klasse ActionListner, Methode actionPerformed, nach dieser Zeile
Java:
Schwert s = new Schwert(1, 1);
noch ein
Java:
(new Thread(s)).start();
machen.

2) Bei der Klasse Schwert statt
Java:
public class Schwert extends JLabel {
folgendes schreiben:
Java:
public class Schwert extends JLabel implements Runnable{

3) Beim Konstruktor der Klasse Schwert die letzte Codezeile, also den move-Aufruf entfernen

4) In die Klasse Schwert eine neue Methode schreiben, und zwar
Java:
public void run ( )
Hier drin wird jetzt move aufgerufen, statt im Konstruktor.

Denke, das wars.
 
Jetzt hab ich noch ein Problem, dass man wahrscheinlich auch mit einem Thread lösen kann.
Also, ich will noch ein KeyListener hinzufügen, aber wenn ich einen Button gedrückt habe funktioniert dieser nicht mehr!? :(

Code:
package beta;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class KeyListner implements KeyListener {
	
	char c;
	int i;
	
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		i = e.getKeyCode();
		System.out.println(i);
		if (i == 83){
			Schwert s = new Schwert(2);
			System.out.println(i);
		} else if (i == 66){
			Bogen b = new Bogen(2);
			System.out.println(i);
		}
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

}
 
Du vergisst bei deinem Code, den Schwertthread zu starten.
Die gleichen Sachen wie für das Schwert gelten auch für den Bogen.

Und dein Satz ist irgendwie zweideutig.
Geht jetzt nach einem Tastendrück kein Button mehr oder reagiert nach einem Buttonklick keine Taste mehr?
 
Postest du vllt. nocheinmal den aktuellen Code?

Musst ja nicht jede Datei hierher kopieren, kannst auch einfach den Ordner gezippt hier raufstellen
 
Zurück