Methode pausieren bis Button gedrückt wird

superjojo140

Mitglied
Hallo

Ich arbeite an einem Adventure game.
Es soll ein Textausgabefeld geben (jLabel) in dem Nachrichten mitgeteilt werden (wie z.B. bei Pokemon).
Wenn nun in einer Methode mehrere Nachrichten ausgegeben werden werden diese sofort hintereinander ausgegeben und nur die letzte ist sichtbar.

Wie kann ich Eine Wartezeit einbauen?
Am besten wäre, wenn die Methode so lange pausiert würde, bis ein jButton gedrückt wird oder eine Taste gedrückt wird.

p.s
-Ich bin sicher nicht der erste der das fragt, habe aber auch nach einigem googlen nichts passendes gefunden, deshalb nun meine frage hier.
_die wait()-Methode klappt nicht. Das Label wird wohl nicht so schnell geupdatet.
-Ich benutze den Java-Editor und das noch nciht sehr lange.
 
Hi,

ich würde den Input vom Output trennen.
Für den Input würde ich eine Sammelstelle implementieren, die alle Nachrichten schön hintereinander in sich hält.
List, Map, Tables, Arrays, was Dir besser passt.

Den Output würde ich so implementieren, dass dieser von dem erwähnten Button gesteuert wird. Wird Button betätigt, so wird im JLabel die nächste Nachricht angezeigt, usw. biss der Input leer ist.

Also mit dem Button-Klick springst du in der Liste mit den Nachrichten zur nächsten Nachricht.
Die alten Nachrichten kannst du dann eben löschen.

TIP!!! In diesem Fall in einer Methode eine Unterbrechung einzubauen ist nicht so geschickt.
Besser ist, dass die zweite Hälfte deiner Methode als eine neue Methode implementiert wird.
So hast du keine halben Sachen, dann nur ganze Sachen.
:rtfm:ActionListener:rtfm: soll ein Begriff sein, sonst nachlesen...:rtfm:

MfG
SLON
 
Hallo

Vielen Dank erstmal für die schnellen Antworten. 🙂

@slon Die Idee ist gut, nur wie soll ich die nächste methode starten dann starten?

Hier kommt auch noch der Quellcode wie ich es gern hätte:

Java:
jLabel1.setText(name1+" gereift an.");

    //warten auf knopfdruck

    int r= (int) (Math.random()*10 );
    if (r==1) {
      jLabel1.setText(name1+"s Atacke geht daneben.");
    } else {
      jLabel1.setText(name1+"s Atacke trifft.");

    //warten auf knopfdruck

    leben1=leben1-verlust;
    jLabel1.setText(name1+"hat noch "+String.valueOf(leben1)+" Leben");

    //warten auf knopfdruck

    if (leben1<0) { jLabel1.setText(name1+" ist tot."); }
} // end of if-else

name1 ist der name des wesens, dass gerade kämpft
leben1 ist die Anzahl der Lebenspunkte von dem Wesen
verlust ist die Anzahl der Lebenspunkte, die verloren werden
 
jLabel1.setText(name1+" gereift an.");
jLabel1.setText(name1+"s Atacke geht daneben.");
So etwas geht generell NICHT in Swing!

Warum nicht?

Dein Handler blockiert für die Dauer des Handlers den Event-Dispatch-Threaf (EDT) und daher siehst du auch nie die erste Ausgabe im Label, sondern immer nur die Letzte. Denn dann ist dein Handler fertig und Swing kann die GUI "normal" refreshen.

Also musst du Swing die Möglichkeit geben zwischen deinen Aktionen die GUI zu "malen", indem du deine GUI-Aktionen auf mehrere Threads aufteilst. Dazu habe ich mal einen kleinen Blog-Eintrag geschrieben.
 
Hallo superjojo140,

JAVA ist objektorientiert, kein Spagettin Code. Es scheint mir so zu sein, dass dein Programm linear abläuft -> also alles nacheinander. Es war in c so, dass man auf eine Eingabe in der Konsole gewartet hatte, dann ging man mit der Ausführung des Programs weiter.
Mir scheint es so zu sein, dass es sich bei dir nicht um eine Methode handelt, sondern um den Rompf einer Schleife.
Jeder Schleifenschritt ist ein neuer Angriff auf dein Wesen. In deiner einfachen Ausgabe versuchst du einzelen Aktionen auszuwerten und zu berichten.
Dein erstes Objekt ist das Wesen, dass in sich noch in einer Instanzvariablen die Anzahl von Leben hält.
Dein zweites Objekt ist das System, das das erste Objekt kennt und die Ausgabe macht,
Wenn das este Objekt angreift, so sendest du an das zweite Objekt "Messages", ohne erstmal zu wissen, wie und wann diese ausgegeben werden. Dann ist die Aufgabe des ersten Objekts erledigt.
Nun zum zweiten Objekt: es sammelt die Messages in ener Liste. Jetzt muss man überlegen, wie man diese ausgibt.
Wenn du willst, dass die einzelnen Messages mit jedem weiteren Knopfdruck ausgegeben werden, dann erstellst du einen ActionListener auf den gewünschten Knopf. Und der AktionListener hat eine Methode, die immer aufgerufen wird, wenn deine Aktion (Keydruck) ausgeführt wird. In dieser Methode nimmst du eine Message von der Liste und zeigst diese an, Wird ein weiterer Keydruck ausgelöst, wird die nächste Message ausgegeben. Dein Wesen ist schon lange tot, aber die Ausgabe der Messages steuerst du selbst, also du weißt es noch nicht.
Dein wesen kämpft ununterbrochen in einer Schleife weiter, bis es tot ist.
Möchtest du, dass dein Wesen nur dann angreift, wenn du möchtest, so musst du eine weitere Action erstellen und einem weiteren Key den Action Listener hunzufügen.

Bei dieser event basierten Implementierung wartet kein Programmteil auf den anderen. Teilst du dem Programm etwas mit, dazu sind eben die Listener da, so reagiert dein Programm entsprechend, führt jede Methode zuende aus und wartet auf die nächste Mitteilung von dir.

Lies bitte den Observer Muster durch, nur diesen Muster:
Design Pattern Katalog
:rtfm:

Gruß
SLON
 

Zurück
Oben