Wieso funktioniert System.out.println aber label.setText() nicht?

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();
}
Woher ich das weiß:Berufserfahrung – Freiberuflicher Java Entwickler mit 10 Jahren Erfahrung

regex9  14.01.2023, 14:10

Siehe meine Antwort. Für die Aufgabe ist ein Timer geeignet.

0
Xearox  14.01.2023, 14:11
@regex9

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.

0
regex9  14.01.2023, 14:14
@Xearox

Das macht alles intern schon der Swing Timer für dich (Thread anlegen, verwalten, etc.).

0