Etwas was nach jedem GUI 'click' ausgeführt wird

Bolic

Mitglied
Hallo Freunde,

an der Überschrift merkt ihr sicherlich schon, dass es mir schwer fällt das Problem zu benennen.
Gibt es etwas/einen Bereich wo ich Befehle reinschreiben kann, die nach jeder GUI-Aktion ausgeführt werden?
Mit GUI-Aktionen meine ich überwiegend die Betätigung eines Buttons.

Ich möchte also nach jedem Buttonklick Methoden ausführen können.

Nun stellt ihr euch die Frage, warum ich nicht einfach ans Ende des Actionlisteners die Methoden dran packen kann/will:

Es handelt sich um ein rundenbasierendes Spiel. Nach jedem Klick von mir wird überprüft, ob ich noch "Klicks" für diese Runde übrig habe. Ist das nicht der Fall wird die Methode
Code:
letKiPlay()
ausgeführt. In dieser Methode wird zwei mal
Code:
Thread.sleep(int)
aufgerufen, damit nicht alle Sachen direkt geschehen, sondern dass es so aussieht, als ob die Ki wirklich spielt. Problem ist dabei, dass ich die gesamte Zeit einfach warte, WÄHREND der Button gedrückt bleibt (ist optisch eingedrückt), und am Ende es dann doch so ist, dass alles gleichzeitig dargestellt wird.

Meine Idee ist es also nun, diese Methode nicht mehr im Button aufzurufen sondern wo anderes. Nur wo?


Ich hoffe ich konnte das Problem halbwegs klar darstellen.

Danke für eure Mühen

Greetz
 

The_S

Top Contributor
Dein Problem hat nichts mit einem ActionListener und Reaktion auf Button klicks zu tun, sondern mit Threads. Die musst das Rechnen und Schlafen der KI in einen eigenen Thread auslagern und die GUI nach und nach aktualisieren.
 

Bolic

Mitglied
Hey,

vielen Dank für die Tipps. Habs nun auch so umsetzen können, dass es funktioniert.

Habe aber noch ein paar Fragen ehe ich die Lösung präsentiere ;)

1) Anhand des Szenarios von dem oberen Post, gibt es eine elengantere Weise "zu warten"? Mir scheint es, dass die Lösung mit dem Thread eher was hingebogen ist.

2) Ich gehe wie folgt vor.

Java:
package Roleplay;

public class Ki extends Thread {

	static Spieler kI;
	static Spieler spieler;
	static int upperRange = 100;
	static int midRange = 50;
	static int bottomRange = 15;
	static int random;
	
	@Override
	public void run(){
		try{
		    sleep(2000);
		}catch(InterruptedException e){
		    e.printStackTrace();
		}
		letKiPlayCast();
		try{
		    sleep(2000);
		}catch(InterruptedException e){
		    e.printStackTrace();
		}
		letKiPlayRandom();
		if(Main.spieler1Cast + Main.spieler1Random == 0){
			Check.switchAktivButton(0);
			Check.checkIfNextSpieler1();
			Check.checkIfEnd();
		}
	}
	
	public static void letKiPlayCast(){
		kI = Main.spielerpool.getSpieler(1);
		spieler = Main.spielerpool.getSpieler(0);
		
		random = (int) Math.random()*10;
		if(Main.spieler1Cast > 0){
			Main.spieler1Cast--;
			if(kI.getHp() > upperRange){
				spieler.setHp(kI.doDamageHit1(spieler.getHp(),spieler.getAp()));
			}
			else if(kI.getHp() < upperRange && kI.getHp() > midRange){
				if(random <= 5){
					spieler.setHp(kI.doDamageHit1(spieler.getHp(),spieler.getAp()));
				}
				else{
					spieler.setHp(kI.doDamageHit0(spieler.getHp(),spieler.getAp()));

				}
			}
			else if(kI.getHp() <= bottomRange){
				if(random <= 1){
					spieler.setHp(kI.doDamageHit1(spieler.getHp(),spieler.getAp()));
				}
				else{
					spieler.setHp(kI.doDamageHit0(spieler.getHp(),spieler.getAp()));

				}
			}
			Frame.textAreaLeftStats.setText("HP: "+spieler.getHp()+"\nAP: "+spieler.getAp());
			Frame.textAreaCombatLog.append("\n The Enemy hits you!");
		}
	}
	public static void letKiPlayRandom(){
		if(Main.spieler1Random > 0){
			Main.spieler1Random--;
			random = (int) Math.random()*10;
			if(random < 5){
				kI.doSelfBuff1();
				Frame.textAreaCombatLog.append("\n The Enemy heals his self!");
			}
			else if(random >= 5){
				kI.doDamageHit2(spieler.getHp(), spieler.getAp());
				Frame.textAreaCombatLog.append("\n The Enemy hits you!");
			}
			Frame.textAreaRightStats.setText("HP: "+kI.getHp()+"\nAP: "+kI.getAp());
		}
	}
}

Habe also die Klasse einfach umgeschrieben, sodass ich in der Main ein Objekt der klasse erstelle. Dann Obejekt.start() an der Stelle wo ich es eben haben will. Thread wird so wie gewollt ausgeführt.

ABER: ich kann den Thread nicht nochmal aufrufen. Sobald er einmal terminated ist, kann er aber per start nicht mehr aufgerufen werden. Meine Lösung ist dass ich einfach jedesmal ein neues Objekt nach dem terminaten erstelle..... Gibts da nicht was eleganteres, sinnvolleres? Finde leider keine Lösung
 

The_S

Top Contributor
1) Anhand des Szenarios von dem oberen Post, gibt es eine elengantere Weise "zu warten"? Mir scheint es, dass die Lösung mit dem Thread eher was hingebogen ist.

Man könnte noch einen Timer verwenden und eine Aktion zum Zeitpunkt x ausführen lassen anstatt mit Thread.sleep zu warten. Ich finde hier spricht aber nichts gegen Thread.sleep.

2) Ich gehe wie folgt vor.

...

Habe also die Klasse einfach umgeschrieben, sodass ich in der Main ein Objekt der klasse erstelle. Dann Obejekt.start() an der Stelle wo ich es eben haben will. Thread wird so wie gewollt ausgeführt.

ABER: ich kann den Thread nicht nochmal aufrufen. Sobald er einmal terminated ist, kann er aber per start nicht mehr aufgerufen werden. Meine Lösung ist dass ich einfach jedesmal ein neues Objekt nach dem terminaten erstelle..... Gibts da nicht was eleganteres, sinnvolleres? Finde leider keine Lösung

Siehe Thread (Java Platform SE 6) . Ein einmal beendeter Thread kann nicht neugestartet werden. Ich kenne die Struktur/den Aufbau deines Programmes nicht, aber ich denke mal es wäre geschickter deine KI Runnable implementieren zu lassen und dann bei jedem Aufruf ein neues Thread-Objekt um dein Runnable zu bauen und das dann zu starten.

Ich muss aber dazu sagen, dass ich aus der Java EE Schiene komme und deshalb nichts mit Threads in ihrer Reinform zu tun habe. Also kA obs da ein Best Practice gibt.
 

Bolic

Mitglied
Hm, sehe ich das richtig, dass der Unterschied zwischen
Code:
extends Thread
und
Code:
implements Runnable
nur der ist, dass wenn ich Runnable, also das Interface benutze, die Klasse noch von weiteren Klassen erben kann?

Sehe da sonst nun grad keinen Vorteil.

Grüße
 

The_S

Top Contributor
Auch. Aber ein Runnable-Objekt kannst (bzw. musst) du in ein Thread-Objekt verpacken und musst es nicht jedes mal neu erzeugen.
 

Bolic

Mitglied
Perfekt. Danke das hat mir alles sehr geholfen ;)

Wenns ein Admin ließt kann er ja den Thread verschieben. Gehört ja doch nicht ins GUI Forum ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
W JavaFX CSS und Vererbung - ich brauche nochmal etwas Nachhilfe AWT, Swing, JavaFX & SWT 28
F Popup Menu etwas verschieben AWT, Swing, JavaFX & SWT 2
steven789hjk543 Swing Verstehe etwas beim GUI nicht AWT, Swing, JavaFX & SWT 3
W JavaFX Etwas Tabellenartiges + Cell-Content-Changed-Event (o.ä.) AWT, Swing, JavaFX & SWT 30
D JavaFX Erkennen wenn eine Anwendung geschlossen wird und etwas tun? AWT, Swing, JavaFX & SWT 4
B Graphics -> Graphics2D etwas zu beachten? AWT, Swing, JavaFX & SWT 8
A Swing " comboboxes vergl. wenn aus der 1. etwas gewählt wurde ist, es in der 2. nicht mehr sichtbar AWT, Swing, JavaFX & SWT 9
J Zählen, wie oft etwas gezeichnet wird AWT, Swing, JavaFX & SWT 2
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
C Etwas durchsichtig machen über einem Panel AWT, Swing, JavaFX & SWT 7
M Dialog soll etwas an "Oberklasse" übergeben AWT, Swing, JavaFX & SWT 3
P Action Event abfangen etwas anders? AWT, Swing, JavaFX & SWT 2
E etwas anderer rahmen. AWT, Swing, JavaFX & SWT 2
F gibt etwas wie frames in html auch in java? AWT, Swing, JavaFX & SWT 19
T JLayerdPane: wie etwas über eine AWT Komponente zeichen? AWT, Swing, JavaFX & SWT 2
J Gui soll sich ändern wenn etwas passiert AWT, Swing, JavaFX & SWT 11
W aus JList etwas löschen AWT, Swing, JavaFX & SWT 9
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
H JavaFX Fenstergröße nach maximieren erkennen AWT, Swing, JavaFX & SWT 6
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18
T ListView nach Erweiterung Fehler in CellFactory AWT, Swing, JavaFX & SWT 8
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
VPChief Nach abspielen von Sound reagiert das Program nichtmehr AWT, Swing, JavaFX & SWT 9
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
S JavaFX Slider freezt nach Benutzung AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
F JavaFX Zustand der CheckMenuItems behalten nach Programmneustart AWT, Swing, JavaFX & SWT 7
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
stroggi Swing Suche nach Kurveneditor (UI-Element) AWT, Swing, JavaFX & SWT 1
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
MiMa Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
L JTextField erscheint erst nach Veränderung der Framegröße AWT, Swing, JavaFX & SWT 5
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
F AWT Robot Klasse Screenshot nach Pixelmustern in bestimmten Radius um Bildschirmmittelpunkt absuchen AWT, Swing, JavaFX & SWT 13
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
L JavaFX Java FX Anwendung nach MVC mit Observer Pattern AWT, Swing, JavaFX & SWT 15
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
MrSnake Tabelle nach 2 Strings Filtern AWT, Swing, JavaFX & SWT 3
N Swing JFormattedTextField keine Werte nach Formatzuweisung AWT, Swing, JavaFX & SWT 0
T Swing Tabelle mit Button - Anzeigefehler nach Zeile entfernen AWT, Swing, JavaFX & SWT 1
R LookAndFeel Wie kann man die Textfarbe der Nimbus ProgressBar nach Füllstand ändern? AWT, Swing, JavaFX & SWT 2
KilledByCheese Swing Seltsame Ausgabe nach ButtonClick AWT, Swing, JavaFX & SWT 1
thobren JavaFX textarea nach setPrefRowCount Ansicht aktualisieren AWT, Swing, JavaFX & SWT 1
L Graphik nach 100 ms neu laden AWT, Swing, JavaFX & SWT 1
B Doppelte MenuBar -> Nach Minimieren verschwunden AWT, Swing, JavaFX & SWT 3
W JComboBox auffristen nach Listenänderung AWT, Swing, JavaFX & SWT 20
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
A JFace/SWT: ListViewer Inhalt nach Selection in zweitem List Viewer aktualisieren! AWT, Swing, JavaFX & SWT 5
E JMenu erscheint nach RDP-Verbindung auf falschem Desktop AWT, Swing, JavaFX & SWT 1
B Resize von Image nach Resize von Button AWT, Swing, JavaFX & SWT 1
M Swing PDF Datei nach drucken nicht löschbar AWT, Swing, JavaFX & SWT 6
M JavaFX TableView nach Spalte sortieren AWT, Swing, JavaFX & SWT 1
F 2D-Grafik Grafikproblem nach Aufruf von JColorChooser-Dialog AWT, Swing, JavaFX & SWT 6
J JTable filtern nach einer Spalte AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben