Wieso funktioniert System.out.println aber label.setText() nicht?
Ich muss einen Timer programmieren, der Runterzählt, bei System.out.println zählt er auch runter... 5 4 3 2 1
aber bei " timerAnzeige.setText("Time: " + time); " kommt nur die endzahl 1, am ende des timers raus und es zählt nicht schritt für schritt runde.
Danke im Vorraus
public void Timer(){
if (timer == "start"){
time = 5;
while (time > 0){
timerAnzeige.setText("Time: " + time);
System.out.println(time);
wait(1000);
time = time - 1;
//System.out.println(time);
}
}
}
2 Antworten
Die Oberfläche von Swing aktualisiert sich nur in eigenen Intervallen. Da deine Schleife den UI-Thread blockiert, wird auch keine Aktualisierung der grafischen Oberfläche vorgenommen.
Verwende einen Swing Timer stattdessen.
private int time = 5;
private Timer timer;
private void count() {
timer = new Timer(1000, evt -> {
if (time < 0) {
timer.stop();
return;
}
yourLabel.setText("Time: " + time--);
});
timer.start();
}
Erstens, einen String vergleicht man nicht mit == sondern mit string.equalsIgnoreCase() oder string.equals()
Wenn du mit der GUI arbeitest, musst du einen anderen Thread verwenden, um den Text zu aktualisieren.
Ich komme nur nicht gerade auf die Methode, die du dafür verwenden musst und habe aktuell auch keine IDE für Java installiert. Ich befragt da gleich mal ChatGPT, die KI weiß bestimmt die Lösung.
Edit: Pack den Countdown in einen eigenen Thread und führe die Methode
SwingUtilities.invokeLater()
aus.
Beispiel:
void updateLabel(String text) {
SwingUtilities.invokeLater(new Runnable() {lbl.setText(text); });
lbl.repaint();
}
Ich wollte gerade meine Antwort editieren ;-) Mein Ansatz wäre jetzt gewesen, den Countdown in einen anderen Thread zu packen, den man auch einschlafen lassen kann. Dann in diesem Thread die Methode SwingUtilities.invokeLater() aufrufen.
Das macht alles intern schon der Swing Timer für dich (Thread anlegen, verwalten, etc.).
Siehe meine Antwort. Für die Aufgabe ist ein Timer geeignet.