bei JLabel.setText(..) wird neuer Text über den alten geschrieben?

Reticent

Erfahrenes Mitglied
Hollo liebe Leute,


ich bin schon am verzweifeln :(
habe folgendes Problem: ein JLabel in dem ich einfach die abgelaufene Zeit anzeigen möchte wird ständig übermalt wenn ich setText mache.
Code:
class Task   extends TimerTask  
  { 
      public void run()  
    { 
         long currentUserElapsedTime = System.currentTimeMillis() - startTime; 
          
       try{ 
          userScor.setUserElapsedTime(userElapsedTime + currentUserElapsedTime); 
          //lblElapsedTime.invalidate();  
          lblElapsedTime.setText( new java.sql.Time(userElapsedTime + currentUserElapsedTime -3600000).toString()); 
          //lblElapsedTime.invalidate();  
          //lblElapsedTime.repaint();//validate(); ? 
       }catch(RemoteException e){ 
          System.out.println("RemoteException, TimerTask"); 
       } 
    } 
  }
starte ich das ganze so
Code:
Timer timer= new Timer(); 
// Timer starten nach 1000 ms und dann jede weitere 1000 ms rein ins Task
timer.schedule( new Task(), 1000, 1000 );
bei jedem aufruf wird der Text in meinem Label nicht neu geschrieben sondern drüber. Und man sieht Teile vom alten Text.

WIESO NUR?

wenn ich lblElapsedTime.setText(...) nicht im Timer zig mal nacheinander setze, geht es ohne Problemme. Ich habe schon mit einem Thread versucht. Und die verschiedensten Kombinationen von repaint(), validate(), invalidate(), doLayout() ,revalidate() und updateUI() probiert. Hilft nichts - Ergebniss bleibt gleich : Label wird übermalt und alles wird natürlich immer dunkler.

Woran liegt es? Helft mir bitte.
 
Das hört sich ja sehr merkwürdig an. Nehme an das JLabel liegt in einem JFrame o.ä.? Probiers dann mal mit frame.update(); oder frame.update(frame.getGraphics());
 
danke, habe versucht. Leider ohne Erfolg. Aber ich habe jetzt statt JLabel nur Label benutzt und es geht ohne Problemme. Ich muss nur noch den Hintergrund anpassen.

Danke an alle!
 
grüß Dich,
ich bin mir nicht ganz sicher, aber könnte es sein, dass Dein Task nicht im richtigen Thread läuft?
Ich denke um es zum gelingen zu bringen müsste er im thread der Event-Queue laufen.
das erreicht man in dem man eine der Routinen
SwingUtilities.invokeAndWait(Runnable);
SwingUtilities.invokeLater(Runnable);
verwendet.
um erstmal festzustellen in welchem Thread Dein Label upgedated wird empfehle ich Dir folgendes mal mit reinzusetzen:
System.out.println("Thread="+Thread.currentThread().toString());


viel Glück

Takidoso
 
Da fällt mir grade noch ein, dass man auch alternativ zu Deinem verwendeten Timer, ich glaube Du gebrauchst den java.util.Timer, den javax.swing.Timer verwenden kannst, denn der setzt das ganze gleich in den Thread der Event-Queue

viel Glück

Takidoso
 
Zurück