# In einer While-Schleife auf Event warten



## Juergen-87 (17. Aug 2014)

Hallo,

ich programmiere ein kleines Kartenspiel das in drei Runden abläuft.
Innerhalb der Runde werden immer zwei Karten aufgedeckt, von denen sich der Spieler für eine entscheiden soll. Gegen die muss er kämpfen.
Das passiert solange, bis ein Kartenstapel alle ist, dann beginnt die neue Runde.

Beim Aufdecken der Karten wird ein neuer Frame geöffnet, in dem die Karten angezeigt werden. Dann wird per Button-Klick eine davon ausgewählt. Jetzt habe ich das Problem, dass nach dem Aufdecken der Karten gewartet werden soll, bis ein Button gedrückt wird. Wie kann ich das machen??? Geht das nur über Threads (habe ich bisher noch nie verwendet (Anfänger )) oder gibt es noch eine andere Lösung?
Wenn es nur über Threads geht, wie kann man so einen Wartethread denn möglichst einfach umsetzen? Ich brauche ihn im weiteren Spielverlauf auch noch an anderen Stellen.

Oder wäre es besser, das Spiel gar nicht über Schleifen zu steuern, sondern sich irgendwie direkt von einem Event zum nächsten zu hangeln und zwischendurch immer abfragen, ob der Kartenstapel leer ist?

So sieht die Hauptspiel-Schleife bei mir aus:

```
for (int i = 1; i<=3;i++){
			runde.setText("Runde: "+i+"/3");
			while(gefahrenkartenStapel.size()>0){
				JFrame gegnerAuswahl = new JFrame();
				JButton karteEins = new JButton();
				JButton karteZwei = new JButton();
				gegnerAuswahl.setSize(300, 300);
				karteEins.setText((gefahrenkartenStap.pop()).toString());
				karteZwei.setText((gefahrenkartenStapel.pop()).toString());
				gegnerAuswahl.setLayout(new GridLayout(1,2));
				gegnerAuswahl.add(karteEins);
				gegnerAuswahl.add(karteZwei);
				gegnerAuswahl.setVisible(true);
				spielFrameAktualisieren();
//TODO Hier wird der Kampf gegen die Karte umgesetzt
			}
		}
```

Das ist alles noch bissel provisorisch zum Testen. Eigentlich werden dann auf den Buttons Bilder angezeigt.


----------



## Ruzmanz (17. Aug 2014)

Wenn du anstatt dem JFrame einen modalen JDialog verwendest, hat der Anwender keine Möglichkeit etwas anderes außerhalb des "Popups" (Kartenauswahl) zu machen. Ist es das, was du willst?


----------



## Juergen-87 (17. Aug 2014)

An der Stelle würde das vielleicht reichen. Aber kann ich den Buttons eines JDialog auch Bilder zuweisen? Ich dachte, da geht nur Ja oder Nein und ich schreibe noch etwas Text dazu...
Und jetzt poppen mir alle JFrames auf einmal auf (bis der Stapel leer ist). Wäre das denn bei dem JDialog nicht auch so, oder stoppt der wirklich die Schleife, bis ich einen Button geklickt habe?

Im weiteren Verlauf brauche ich dann beim Kampf gegen die ausgewählte Karte auch noch eine Möglichkeit, dass die Spiel-Schleife solange aussetzt, bis der Kampf beendet ist. Ich könnte das ja z.B. über einen ActionListener machen, der dann die Kampfaktion startet, wenn ich bei meinem Auswahlfenster eine Karte ausgewählt habe. Soweit ich weiß, wird doch bei einem ActionEvent auch ein neuer Thread gestartet, der erst abgearbeitet wird, bevor das Hauptprogramm weitergeht. Aber jetzt steht wieder die Frage, ob ich einem Button im JDialog einen ActionListener zuordnen kann???


----------



## Bug Fisher (17. Aug 2014)

Ich würde dir raten, ersteinmal NICHT an den SPIELABLAUF zu denken, sondern nur die GUI zu bauen.
Und zwar so, dass nicht jedesmal, alles neu erstellt wird (sag mal, flackert das nicht ? )
Du erzeugst ja haufenweise Fenster.

Erzeuge EIN Fenster, packe die Buttons drauf und gucke, dass du die actionPerformed() aus ActionListener implementierst, sodass du weisst, was wo passiert, wenn ein Button gedrückt wird.

Dann kannst du zum Spielablauf kommen, und zwar so, dass du das EINE vorhandene Fenster entsprechend modifizierst (bzw. dessen JButtons) und nicht jedesmal einfach ein komplett neues auf den heap und den Bildschirm packst.

Wenn du so wie jetzt quick and dirty weitermachen willst, dann haben meine Vorredner recht; nimm einen Dialog, achte auf die Eigenschaft 'modal' (auf true setzen) und du siehst direkt den Unterschied.

Also die Zeile einfach abändern nach

```
final JDialog gegnerAuswahl = new JDialog(null, true);
```


----------

