Swing JLabel.setText und Multithreads

SbaTyr

Neues Mitglied
hallo zusammen,
ich schreibe gerade ein Programm, bei dem ich auch Swing Componente wie TextAreas oder JLabel verwende. Ein Label soll nun jede Sekunde die Uhrzeit anzeigen, die natürlich dann auch jede Sekunde aktualiert wird.

Java:
class Clock extends Thread implements Runnable{
		
		public void run() {
			
			while (true) {
				
				try {
					
					currentTime = new Date();
		            labelClock.setText(formatter.format(currentTime));
					Clock.sleep(1000);
					
				} catch (Exception e)  { e.printStackTrace(); }
			}
		}
	}

Leider läuft auf diese Weise einmal in der Sekunde eine Art ruckeln durch das Programm, welches bei einer einfachen Textausgabe nicht der Fall ist (auch wenn der Thread viel kürzer "schläft"). Daher vermute ich, dass das Über das Textsetzen im JLabel ist.
Gibt es eine performancetechnisch bessere Lösung für setText?
 
Ich denke nicht. Die Ursache müsste woanders liegen.

P.S.
Code:
implements Runnable
kannst du weglassen.
 
danke für die fixen Antworten ... aber

außer setText macht die Clock doch nichts (ich hatte mir überlegt, dass das irgendwie daran liegen muss, dass setText nicht Thread-sicher ist, obwohl ich nicht genau weiß, was das heißt...) und ohne die Clock läuft alles super ...

und wenn ich extends Thread weglasse kringelt der in Eclipse rot rum und sagt mir:

The method sleep(int) is undefined for the type Clock

mit hingegen nicht, oder gibt es da auch 'ne Alternative?
 
sleep() ist eine statische Methode zufällig der Thread-Klasse,
schreibe bei statischen Methoden besser immer
> Klassenname.methodenName(parameter);
das geht von überall aus

natürlich sind noch andere Dinge zu beachten, wenn die Klasse kein Thread mehr ist dann muss du sicherlich irgendwo
> new Thread(objektDerKlasse).start()
schreiben, statt vorher vielleicht
> objektDerKlasse.start()

----

selbst wenn setText() die Probleme verursacht, was einfacheres/ anderes gibt es nicht
außer das Programm komplett umzubauen und extrem komplizierte eigene Grafik-Routinen einzubauen,

ein komplettes kleines Testprogramm wäre etwas überzeugender, wobei sowas auf anderen PCs auch ohne Probleme laufen könnte
 
Java:
class Clock implements Runnable{
        public void run() {
            while (true) {
                try {
                    String dateString = formatter.format(new Date());
                    SwingUtilities.invokeLater(new Runnable() {
                          public void run() {
                              labelClock.setText(dateString);
                          }
                    });
                    Thread.sleep(1000);
                } catch (Exception e)  { e.printStackTrace(); }
            }
        }
}
Zu starten per:
Java:
new Thread(new Clock()).start();
 

Zurück
Oben