# Label sekündlich aktualisieren



## itstata (13. Mai 2008)

Hallo,
ich möchte ein Label in einem bestimmten Intervall aktualisieren. Hintergrund ist, dass ich bei einem ProgressBar etwas einbauen möchte, was die Übertragungsrate je Sekunde anzeigt z.b. (30kb/s etc.).

Leider hab ich wohl noch ein paar Verständnissproblme was Threads im Umgang mit Swing betrifft.

Hier mein nicht funktionierender Versuch

```
package abruf.client;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class SecRefresh {
	static JFrame f;
	static JLabel zaehlerLabel;

	public static void main(String[] args) {
		f = new JFrame("Test");
		zaehlerLabel = new JLabel("leer");
		f.add(zaehlerLabel);
		f.pack();
		f.setVisible(true);

		new Thread(new Runnable() {
			public void run() {
				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						int i = 0;
						while (true) {
							try {
								Thread.sleep(1000);
							} catch (InterruptedException e) {
								// skipped
							}
							zaehlerLabel.setText(String.valueOf(i));
							i++;
						}
					}
				});
			}
		}).start();
	}

}
```

Hat jemand eine Idee, wo der Fehler liegt?
eigentlich sollte das Label "zaehlerLabel" jede Sekunde um eins erhöht werden. repaint, validate bringen da nix.

Gruß
L.


----------



## Gast (13. Mai 2008)

naja du kannst auch einfach nen text in die progressbar schreiben, is vielleicht einfacher. zum updaten nimm den swingworker, dann klappt das schon.


----------



## SlaterB (13. Mai 2008)

wieso 
SwingUtilities.invokeLater()?
nur für den invokeLater()-Aufruf brauchst du doch keinen Thread,
und dadurch, dass das vom AWT-Thread ausgeführt wird, wird die GUI solange blockiert, also genau falsch

so ist es besser:

```
public class SecRefresh
{
    static JFrame f;
    static JLabel zaehlerLabel;

    public static void main(String[] args)
    {
        f = new JFrame("Test");
        zaehlerLabel = new JLabel("leer");
        f.add(zaehlerLabel);
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        new Thread(new Runnable()
            {
                public void run()
                {
                    int i = 0;
                    while (true)
                    {
                        try
                        {
                            Thread.sleep(1000);
                        }
                        catch (InterruptedException e)
                        {
                            // skipped
                        }
                        zaehlerLabel.setText(String.valueOf(i));
                        i++;
                    }
                }
            }).start();
    }

}
```
wenn du willst kannst du dann noch die einzelnen setText()-Aufrufen per invokeLater() ausführen, aber nicht die ganze Schleife!

---------

da main bereits ein anderer Thread als der AWT-Thread ist, ginge auch noch simpler


```
public class SecRefresh
{
    static JFrame f;
    static JLabel zaehlerLabel;

    public static void main(String[] args)
    {
        f = new JFrame("Test");
        zaehlerLabel = new JLabel("leer");
        f.add(zaehlerLabel);
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        int i = 0;
        while (true)
        {
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                // skipped
            }
            zaehlerLabel.setText(String.valueOf(i));
            i++;
        }
    }

}
```


----------



## itstata (13. Mai 2008)

vielen dank für eure antworten, es läuft jetzt. ich muss aber einen eigenen thread laufen lassen, da sonst der progressbar nicht weiterlaufen kann. bei dem programm gehts ohne, hast recht.
ich glaub so langsam ist mir auch klar, was das invoke later eigentlich ist


----------

