Timer nach und nach ablaufen lassen

HonniCilest

Erfahrenes Mitglied
ich würde (wie von HonniCilest vorgeschlagen) mit einem Array von Int-Werten arbeiten. In deinem Thread dann alle Array-Elemente durchgehen und den ersten Wert > 0 um 1 runterzählen. Anschliessend der Update aller Textfelder mit den aktuellen Werten und eine Sekunde warten. Solange, bis alle int-Werte auf 0 stehen.

Ja je nachdem. Ich meinem Beispiel habe ich allerdings auf JSpinner zurückgegriffen, welche die Funktion getPreviousValue bietet. Ich würde sie hier lesen uns setzen solange wie möglich, also den countdown direkt in den Feldern anzeigen anstatt im Label, so sieht man auch visuel direkt wo sich der Timer befindet. Falls die vorher eingetragenen Werte anschließend relevant sind, so kann man ja optional die Werte vorher noch in ein Array abspeichern und nach Timer Ende wieder setzen.
 

Buba235

Erfahrenes Mitglied
Hallo HonniCilest!

Wow! Danke für die Hilfe. Das ist im Prinzip genau die Art von Hilfe, die ich wollte. Keine fertige Lösung, sondern Denkansätze. Klasse von dir.
Ich habe diesen Code nun so angepasst, dass der timer sowohl das Label, als auch das jeweilige JSpinner Feld runter zählt. Also nur den Timer angepasst. Ich halte es nicht für sonderlich elegant, aber es klappt. Vielleicht kannst du ja mal deine Meinung dazu sagen:

Java:
        // Timer configuration
        timer = new Timer(FIRE_TIMER, ae -> {
            counter = (int) numericFields[countArray].getValue();
            numericFields[countArray].setValue(numericFields[countArray].getPreviousValue());
            timerLabel.setText("" + counter--);

            if (counter >= 1) {
                timerLabel.setText("Time left: " + counter);
            } else {
                Toolkit.getDefaultToolkit().beep();
                timerLabel.setText("Done!");

                if (countArray != (numericFields.length -1)) {
                    countArray++;
                } else {
                    timerLabel.setText("Countdown finished!");
                    timer.stop();
                }
            }
        });

Die Sache mit dem mehrfach starten des Timers und gegebenenfalls Pausieren habe ich noch nicht gemacht.
 

HonniCilest

Erfahrenes Mitglied
Grundsätzlich geht das schon in die richtige Richtung. Was mir spontan auffällt, du hast nun getPreviousValue und dann counter--. Setz das getPreviousValue for die counter-Zuweisung dann brauchst du das -- auch nicht :)

Ein Hinweis ist mir noch aufgefallen. Neben erneutem Buttonklick solltest du dir auch überlegen was bei anderen Benutzereingaben passieren soll während der Timer läuft, z.B. beim Spinner hoch oder runterklicken.
 

Buba235

Erfahrenes Mitglied
Hallo!

Danke noch mal an alle für euere Hilfe. Es hat mir nicht nur Spaß gemacht, sondern ja auch etwas gebracht. Ich werde alle Tipps und Hinweise beachten und weiter draus lernen.

Gruß
Buba
 

Neue Beiträge