Warten auf Button-Aktion in Schleife?

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hi,

ich programmiere (oder versuche es zumindest) gerade ein kleines Kartenspiel in Java. Zuerst hab ich ne Kommandozeilenversion geschrieben in der man gefragt wird ob man noch eine Karte ziehen möchte oder nicht, dann kann man "yes" oder "no" eingeben und ein BufferedReader wertet das aus. Das wird halt in ner Schleife so lange wiederholt bis der User "no" eingibt und keine Karte mehr will.

Nun wollte ich das Spiel auf eine Swing-Applikation umsetzen und frage mich wie man es hinbekommt, dass das Programm darauf wartet, dass ich einen von zwei in die Swing Oberfläche eingebauten Buttons drücke und auswertet. Bin auf dem Gebiet noch nicht so fit.

Bisher lande ich in ner Endlosschleife und muss manuell den Thread killen.

Die Buttons werden erst enabled wenn das Programm an der Stelle ist wo man gefragt wird. Hatte mir dann gedacht, dass man in den actionPerformed-Methoden der Buttons die variable "wantAnotherCard" auf true setzt und damit den weiteren Ablauf steuert.

Hier ein Codeauszug:
Code:
do {
        txt_anothercard.setText("Would you like to have another card?");
        btn_yes.setEnabled(true);
        btn_no.setEnabled(true);      
         
         // Hier fehlt die entsprechende "Warteschleife" auf Buttondruck.

        if (wantAnotherCard) {
          tempCard = giveRandomCard();
          playerValue += tempCard.getValue();
          pl_card_txt.setText(tempCard.getValue());
          playerCardsCount++;
        }
} while (wantAnotherCard);

Hab im Netz ein Beispiel gefunden wie man das mit ner MessageBox in nem Applet macht mit Threads und dann wait() benutzt, aber hinter Threads steig ich noch nicht wirklich.

Vielleicht hat ja auch einer ne Empfehlung was genau man sich dazu anschauen könnte oder weiß wo es ein Beispiel dazu gibt. Allerdings soll es kein Applet sein! Und da man ja schon von Swing erbt geht es auch nicht von Thread zu erben.

Vielen Dank für Eure Mühe!
 

Grizzly

Top Contributor
Am besten wäre natürlich die Spiellogik von der Oberfläche zu trennen - sowohl in der Consolen- sowie auch in der Swing-Anwendung. Dann bräuchtest Du keinen solchen Thread und die Programmierung wäre viel einfacher.
 

Manfred

Bekanntes Mitglied
Also wenn ich das richtig verstehe, dann wäre hier "einfach" ein ActionListener angebracht, der darauf wartet, dass eben der bestimmte Button gedrückt wird und dann eine entsprechende Routine abgearbeitet wird

Schau dich mal im Forum danach um
 
G

Gast

Gast
@Manfred:
Hm, das mit dem ActionListener haben mir schon mehrere Vorgeschlagen. Nur irgendwie krieg ich den nicht dazu das Programm an der gewünschten Stelle "anzuhalten" um die Eingabe zu tätigen. Im Forum hab ich bisher nichts gefunden das dieser Funktionsweise entspricht und zum Thema "ActionListener" findet man ungefähr 20 Seiten.

@Grizzly:
Was meinst du mit dem Trennen der Spiellogik und der Oberfläche? Wie kann ich sonst die Oberfläche verändern (Anzeige für Karten/-Summe verändern etc.)?

Also bisher ist es so, dass ein Button im Menü des Games die Methode runGame() aufruft, in welcher der gesamte Spielablauf enthalten ist. Nur diese Wartefunktion bereitet mir Kopfzerbrechen.

@pogo:
Das resultiert in nem ausgelasteten Prozess = Endlosschleife, da die Schleife nicht rafft das jetzt ein Button gedrückt werden muss bevor es weitergeht. So wird die Schleife ca 1000000x pro Sekunde ausgeführt bis der Speicher überläuft.
 

Grizzly

Top Contributor
Du solltest versuchen, die Spiele Logik von der Oberfläche zu lösen. So sollten alle Karten sowie die Spielregeln in Klassen bzw. Objekten untergebracht sein. Die Oberfläche stellt diese nur dar. Die Spielelogik könnte bspw. über ein Observer-Observable-Pattern die Oberfläche bzw. die entsprechenden Komponenten der Oberfläche informieren. Oder Du baust das ganze über Listener in Deiner Spielelogik auf und informierst darüber die Komponenten.

So könntest Du sogar bei einem rundenbasierenden Spiel - die Animation mal ausgenommen - sogar ganz ohne Threads auskommen.
 
G

Gast

Gast
Danke an alle für Eure Mühe.

Ich habe das ganze jetzt mit ActionListenern gemacht und habe einfach die Spielelogik so umgestellt das erst eine weitere Methode ausgeführt wird, sobald ein Button gedrückt wird (anstatt den ganzen Code prozedual in eine Methode zu klatschen die dann zwischendurch hätte unterbrochen werden müssen).

Das mit dem JOptionPane wäre natürlich ne sehr gute Möglichkeit, jedoch wollte ich das GUI zu jeder Zeit einsehbar haben (die OptionBox würde evtl. die Kartensumme bzw. einzelne Karten überdecken, was unschön wäre).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Minecraft Plugin: Auf Spielerantwort warten Spiele- und Multimedia-Programmierung 1
J In einer While-Schleife auf Event warten Spiele- und Multimedia-Programmierung 3
F Schleife warten lassen Spiele- und Multimedia-Programmierung 8
T Auf Mausklick warten Spiele- und Multimedia-Programmierung 4
R Memory - Nicht alle Button lassen sich aktivieren? Spiele- und Multimedia-Programmierung 1
dummycoders Android Studio - Button ändert Farbe erst nach Delay? Spiele- und Multimedia-Programmierung 5
H Make a cooldown on a button? Spiele- und Multimedia-Programmierung 1
H Change color on button event Spiele- und Multimedia-Programmierung 2
G [LibGDX] Button Klick Probleme Spiele- und Multimedia-Programmierung 1
J mehrere Listener für einen Button / Label Spiele- und Multimedia-Programmierung 1
X LWJGL - Anklick baren Button erstellen aber wie? Spiele- und Multimedia-Programmierung 6
S Button soll verschiedene panel zufällig durchschalten Spiele- und Multimedia-Programmierung 14
M Mathetrainer - Reset Button funktioniert nicht! Spiele- und Multimedia-Programmierung 8
A Button ausblenden Spiele- und Multimedia-Programmierung 3
P JOGL Button-klick-Problem Spiele- und Multimedia-Programmierung 2
B Problem : Button-Klick bewirkt nichts Spiele- und Multimedia-Programmierung 4
K Button eigenschaften bearbeiten Spiele- und Multimedia-Programmierung 20
B Animation durch Button auslösen Spiele- und Multimedia-Programmierung 2
K Würfel vergrößern und verkleinern per Button Spiele- und Multimedia-Programmierung 7
A ConcurrentModificationException Aktion aussetzen Spiele- und Multimedia-Programmierung 15
Y Jede Aktion sofort speichern Spiele- und Multimedia-Programmierung 5
I Aktion auslösen bei Mausbewegung Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen


Oben