# Warten auf Button-Aktion in Schleife?



## Gast (17. Aug 2004)

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:

```
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!


----------



## pogo (17. Aug 2004)

man könnte eine schleife einbauen, die until buttongedrueckt = true läuft


----------



## Grizzly (17. Aug 2004)

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 (17. Aug 2004)

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


----------



## Gast (18. Aug 2004)

@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 (18. Aug 2004)

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.


----------



## Manfred (18. Aug 2004)

Schau dir vielleicht mal JOptionPane an, da kannst du Eingabedialoge ganz einfach erstellen und es wird so lange gewartet bis bei diesem OK geklickt wird!

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JOptionPane.html


----------



## Gast (18. Aug 2004)

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).


----------

