# Verzögerung in einer Schleife



## Sibylle (7. Feb 2012)

Guten Abend,

das mir vorgegebene Programm läuft fehlerfrei, doch eine Verbesserung soll es noch erhalten:

Wie kann man die Inhalte der Laufvariablen einer For-Schleife zeitverzögert mit zB einer Sekunde anzeigen lassen.
Beispiel die For-Schleife läuft von 1 bis 100 ...
Wie kann man da die einzelnen Werte von 1 bis 100 in einem Textfeld verzögert so anzeigen lassen, dass man optisch den Zähler beobachten kann.
Mit einer Schleife von 1 bis 1 000 000 oder höher in der äußeren Schleife wäre das sicher möglich, andererseits gibt es bestimmt eine Anweisung, die denselben Effekt erzielt.
Besten Dank im Voraus für alle Hilfen.
Einen schönen Abend.

Gruß

Sibylle


----------



## pro2 (7. Feb 2012)

Sowas wie:

```
Thread.sleep(1000);
```
vielleicht?


----------



## Marco13 (7. Feb 2012)

In welchen Thread wird die Schleife ausgeführt?
(Und um das vorwegzunehmen, was meine Kristallkugel sagt: Füg' mal in der Schleife
System.out.println(Thread.currentThread());
ein, und poste, welche Zeile dort immer ausgegeben wird)


----------



## Sibylle (7. Feb 2012)

Hallo,

vielen Dank für beide Beiträge.

Der Programmtest sieht wie folgt aus:

	for(int i=1; i<=100; i++)
	{
		tfausgabe.setText(String.valueOf(i));
		Thread.sleep(1000);
	}
Leider läuft das Progrämmchen nicht durch.
Wer kann helfen?

Gruß
Sibylle


----------



## Firephoenix (7. Feb 2012)

was genau passiert denn?

Der Codeteil den du gepostet hast sollte nach 100 sekunden fertig sein.
Gruß


----------



## HimBromBeere (8. Feb 2012)

> (Und um das vorwegzunehmen, was meine Kristallkugel sagt:


Wow... nicht schlecht, ein Wahrsager, der ohne seine Kugel wahrsagen kann:toll:



> Leider läuft das Progrämmchen nicht durch.
> Wer kann helfen?


Wie läuft nicht durch? Hast du denn auch die 100Sekunden gewartet oder wird vorher bei irgendeiner Zahl tatsächlich abgebrochen (und idealerweise irgendwo eine Exception geworfen)?

[EDIT]





> Mit einer Schleife von 1 bis 1 000 000


Sowas solltest du auch niemals verwenden, da solche Schleifen ja prozessorabhängig sind und du deswegen nie wirklich sagen kannst, wie lange dadurch "gewartet" wird. Abgesehen davon blockierst du damit deine Ressourcen nur unnötig, da in der Zeit absolut nichts anderes gemacht werden kann (wohingegegen mit Thread#sleep() dem Betriebssystem Zeit gegeben wird, sich um seinen eigenen Kram zu kümmern)  [/EDIT]


----------



## Firephoenix (8. Feb 2012)

Andere Vermutung: Try-Catch vergessen bei Thread.sleep...

folgender Code läuft bei mir sauber durch:


```
public static void main( String[] args )
    {
        for(int i = 0; i < 100; i++){
            System.out.println(i);
            try
            {
                Thread.sleep( 1000 );
            }
            catch ( InterruptedException e )
            {
                e.printStackTrace();
            }
        }
            
    }
```

Gruß


----------



## VfL_Freak (8. Feb 2012)

Moin,



HimBromBeere hat gesagt.:


> Sowas solltest du auch niemals verwenden, da solche Schleifen ja prozessorabhängig sind und du deswegen nie wirklich sagen kannst, wie lange dadurch "gewartet" wird. Abgesehen davon blockierst du damit deine Ressourcen nur unnötig, da in der Zeit absolut nichts anderes gemacht werden kann (wohingegegen mit Thread#sleep() dem Betriebssystem Zeit gegeben wird, sich um seinen eigenen Kram zu kümmern)



Zum einen das ... zum anderen habe ich neulich mal die Erfahrung machen dürfen, dass solche Schleifen, wenn sie nichts anderes machen, sogar von den neueren Compilern weg optimiert werden !!

Ich hatte hier in einem übernommen Projekt ebenfalls eine solche Stelle drin, mit der einfach 3 sec. gewartet werden sollte. Nach der Umstellung von VS6.0 auf VS2010 war dann nix mehr mit warten !

Da hilft wirklich nur, den Thread mit dem erwähnten "*sleep*" schlafen zu legen!

Gruß
Klaus


----------



## Sibylle (8. Feb 2012)

Hallo,

ich bin es nochmal, weil mir diese Frage keine Ruhe lässt.
Vielleicht war die Aufgabe unklar gestellt.
Das folgende Programm
	JButton btnstart = new JButton("Start");
		btnstart.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				for (int i = 1; i<=20000; i++)
				{
					tfergebnsi.setText(String.valueOf(i));

				}

soll die Zahlen von 1 bis 20000 hochzählen. 
Am Schluss wird bisher leider nur die Zahl 20000 im Textfeld tfergebnis angezeigt.
Mein Wunsch aber ist es alle Zahlen 1, 2, 3 , 4 usw. bis 20000 anzeigen zu lassen.
Zwischen der Anzeige zweier Zahlen soll dabei eine kleine zeitliche Verzögerung eingebaut werden damit man die einzelnen Zahlen auch im Textfeld eines Eclipse-Frames sehen kann.

Alle Vorschläge, die ich bisher erhalten habe, wurden getestet, bisher leider erfolglos.
Möglicherweise mache ich einen Fehler.

Wie müsste man denn obige Programmzeilen ergänzen, damit das Hochzählen optisch verfolgt werden kann?
Dank im Voraus.

Gruß
Sibylle


----------



## VfL_Freak (8. Feb 2012)

Moin,

bitte benutze die JAVA-Tags !!!!!!



Sibylle hat gesagt.:


> ```
> JButton btnstart = new JButton("Start");
> btnstart.addActionListener(new ActionListener()
> {
> ...



die Methode "setText()" setzt halt immer genau einen String in Textfeld - im Falle Deiner Schleife siehst Du also am Ende immer nur den letzten gesetzten Text - sprich "20000" !

Willst Du wirklich "alle Zahlen 1, 2, 3 , 4 usw. bis 20000" im Feld anzeigen ?
Wie groß ist denn das ???:L:autsch:

Du könntest natürlich so was in dieser Art versuchen :

```
JButton btnstart = new JButton("Start");
btnstart.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent arg0) 
    {

        for (int i = 1; i<=20000; i++)
	{
              String sMeineZahlen = "";
              sMeineZahlen += String.valueOf(i);
              if( i < 20000 )   // unterdrückt das letzte Komma !!
              {
                  sMeineZahlen += ", ";
              }
	}
         tfergebnsi.setText( sMeineZahlen );
```

Ist VHIDT, also ungetestet !

Gruß
Klaus


----------



## Swoop (8. Feb 2012)

Tipps und Tricks dafür gibts hier...

Das erste Ergebnis wäre sehr gut geeignet!


----------



## pro2 (8. Feb 2012)

```
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        Timer t = new Timer();

        t.schedule(new TimerTask() {
            int i = 0;
            @Override
            public void run() {
                jTextField1.setText(String.valueOf(i++));
            }
            if(i == 2000) t.cancel();
        }, 0, 1000);      
    }
```

edit: noch die Abbruchbedingung hinzugefügt.


----------



## M_Schaffrath (8. Feb 2012)

Das 
	
	
	
	





```
.setText()
```
 ändert ja nur den Inhalt der Textvariable der Komponente - wird noch nichts vom Aktualisieren der Ansicht gesagt. 
Hast du mal versucht, die GUI mit 
	
	
	
	





```
.repaint()
```
 in der Schleife zum Aktualisieren zu zwingen?


----------



## Sibylle (8. Feb 2012)

Hallo,

vielen Dank für alle Beiträge.
Zum Beitragvon M_Schaffrath: .repaint() ist mir bisher unbekannt.
Wäre es Dir möglich, dazu die nötigen ProgrammZeilen in meine For-Schleife zu setzten?
Danke.

Zum Beitrag von Pro2:
Vielleicht wäre dies ein gangbarer Ansatz, wobei ich es an einer echten For-Schleife zeigen möchte.
Hast Du dazu ein Programmbeispiel?
Danke.

Zum Beitrag von Vfl-Freak:
Die Stringverkettung scheitert an der Breite des Textfeldes, schade.
Noch eine Idee?
Danke.

Zum Beitrag von Swoop:
Mit dem ersten Beispiel komme ich nicht klar. Es schreibt Dir eine JAVA-Anfängerin.

Was wohl zum Standard eines Beitrags gehört ist die Anzeige der Programmzeilen.
Wie schaltet man diese denn ein?

Viele Grüße

Sibylle


----------



## M_Schaffrath (8. Feb 2012)

Pseudocode:


```
for(int i = 0; i < 100; i++{
   komponentenname.setText(String.valueOf(i)); // ändere die Textvariable der Komponente
   System.out.print(komponentenname.getText + " "); // überprüfe spaßeshalber den Inhalt der Textvariablen
   komponentenname.repaint(); // sage der Komponente, dass sie ihre Anzeige aktualisieren soll
   Thread.sleep(1000); // warte 1000 ms bis zum nächsten Durchlauf
}
```


----------



## xehpuk (8. Feb 2012)

Hier eine sehr simple Implementierung einer Uhr:

```
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Clock {
	public static void main(final String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				final JFrame f = new JFrame();
				f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				final JTextField tf = new JTextField();
				f.add(tf);
				f.pack();
				f.setLocationRelativeTo(null);
				f.setVisible(true);
				new Thread() {
					@Override
					public void run() {
						final SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss.SSS");
						try {
							while (true) {
								Thread.sleep(10);
								tf.setText(df.format(new Date()));
							}
						} catch (final InterruptedException e) {
							e.printStackTrace();
						}
					};
				}.start();
			}
		});
	}
}
```
Statt einer Endlosschleife kannst du dann eben eine for-Schleife mit Laufvariable nehmen.


----------



## Sibylle (8. Feb 2012)

Hallo,

vielen Dank für die neuen Beiträge.

Zum Beitrag von M. Schaffrath:
Mit System.out.println werden die Zahlen angezeigt.
Im Textfeld nur wieder die letzte Zahl und das nur, wenn folgende Zeile mit // ihre Wirkung verliert.
Thread.sleep(1000);
Sonst ergibt es einen Fehler schon vor dem Programmstart.

Hast Du Dein Programm getestet? Und es läuft bei Dir rund?

Mal sehen ob Du eine Erklärung findest weshalb es hier nicht läuft.
Hast Du einen weiteren Vorschlag?

Gruß
Sibylle


----------



## xehpuk (8. Feb 2012)

Hast du meinen Code mal getestet? Sollte laufen.

Ansonsten wäre es schön, wenn du uns deinen kompletten Code (aber so knapp wie möglich) zeigen würdest.
Außerdem sagst du, dass es einen Fehler gibt, aber nennst ihn uns nicht.

Sieht der Fehler vielleicht so aus?

```
Exception in thread "<name>" java.lang.Error: Unresolved compilation problem: 
	Unhandled exception type InterruptedException
	
	at ...
```
Wenn es dieser ist (und du anscheinend damit nichts anfangen kannst), solltest du dir mal die Grundlagen zu Exceptions anschauen, z. B. hier: Lesson: Exceptions (The Java™ Tutorials > Essential Classes)


----------



## pro2 (8. Feb 2012)

Wenn man das mit dem sleep(); auf ein GUI anwendet, friert das Fenster komplett ein. Da hilft auch der repaint Befehl nicht, für die 2000 Sekunden passiert nichts mit dem Fenster. Ich finde ja meinen Vorschlag immer noch am praktischsten, warum brauchst du unbedingt das ganze in einer Schleife?


----------



## Sibylle (8. Feb 2012)

Hallo,

alle Versuche sind bisher leider gescheitert, aber ich bin optimistisch.

Hier nun der mehrfach veränderte Code (aktueller Stand):
	public FORM() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		komponentenname = new JTextField();
		komponentenname.setBounds(94, 40, 217, 67);
		contentPane.add(komponentenname);
		komponentenname.setColumns(10);

		JButton btnberechnen = new JButton("Berechnen");
		btnberechnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
		for(int i = 0; i <= 100; i++)
		{
		komponentenname.setText(String.valueOf(i));
		System.out.print(komponentenname.getText() + " "); // überprüfe spaßeshalber den 
									Inhalt der Textvariablen
		komponentenname.repaint(); // sage der Komponente, dass sie ihre Anzeige 
aktualisieren soll
		// Thread.sleep(1000); // warte 1000 ms bis zum nächsten Durchlauf
					}
			}
		});
		btnberechnen.setBounds(10, 168, 217, 35);
		contentPane.add(btnberechnen);

Für alle weiteren Bemühungen besten Dank im voraus.

Gruß

Sibylle


----------



## Marco13 (8. Feb 2012)

Das hier..



Marco13 hat gesagt.:


> In welchen Thread wird die Schleife ausgeführt?
> (Und um das vorwegzunehmen, was meine Kristallkugel sagt: Füg' mal in der Schleife
> System.out.println(Thread.currentThread());
> ein, und poste, welche Zeile dort immer ausgegeben wird)



hättest du nicht ignorieren sollen. Genausowenig wie die Hinweise darauf, Java-Tags zu verwenden.


----------



## Firephoenix (8. Feb 2012)

Ebenso nicht den Beitrag von xehpuk der mindestens genauso gut lesbar ist wie die dicke rote schrift über dem Eingabefeld beim Antwort schreiben 

Ich bin mir zu 99% sicher, dass du bei deiner Klasse von JFrame erbst und die im standard-Thread als Teil der GUI startest. Damit läuft dein Programm im EDT (falls unbekannt -> google).
Jetzt rufst du aus diesem die actionPerformed()-Methode deines Buttons auf.
Bis deine GUI weiter arbeitet muss allerdings zuerst diese Methode abgearbeitet worden sein (ein Grund dafür, dass man listener immer so schlank wie möglich hält - komplexe Listener die lange Ausführungszeit beanspruchen neigen dazu die GUI einzufrieren).
In deinem Listener wartest du jetzt allerdings 100 Sekunden, dazwischen kommen noch einige repaint-anweisungen etc, diese werden aber (wenn überhaupt) erst nach den 100 Sekunden ausgeführt wenn du die Methode verlässt.

Eine Lösung wäre hier, einen 2. Thread zu starten, damit verlässt du schneller den Listener-Codeblock und deine Gui reagiert wieder. der 2. Thread schickt dann die aktualisierungsbefehle an die GUi (siehe dazu den Post von xehpuk).


----------



## HimBromBeere (9. Feb 2012)

Da ich einfach total selbstlos und grenzenlos nett bin, schreib ich hier mal den Code in anständigen JAVA-Tags...

@Sybille: Da manche hier das Gefühl haben, du weißt nicht, wie du JAVA-Tags erstellst, sag ich es dir nochmal. Entweder du schreibst 
	
	
	
	





```
irgendeinen Text[/ JAVA] (bitte aber ohne das Leerzeichen) oder du drückst in der Werkzeugleiste direkt über deinem Antworten-Textfeld das mit der Kaffee-Tasse an (welches zwischen php und XML zu finden ist).

[code=Java]public FORM() {
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(100, 100, 450, 300);
	contentPane = new JPanel();
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	setContentPane(contentPane);
	contentPane.setLayout(null);

	komponentenname = new JTextField();
	komponentenname.setBounds(94, 40, 217, 67);
	contentPane.add(komponentenname);
	komponentenname.setColumns(10);

	JButton btnberechnen = new JButton("Berechnen");
	btnberechnen.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			for(int i = 0; i <= 100; i++) {
				komponentenname.setText(String.valueOf(i));
				// überprüfe spaßeshalber den Inhalt der Textvariablen
				System.out.print(komponentenname.getText() + " "); 
				// sage der Komponente, dass sie ihre Anzeige aktualisieren soll
				komponentenname.repaint(); 
				// warte 1000 ms bis zum nächsten Durchlauf
				// Thread.sleep(1000); 
			}
		}
	});
	btnberechnen.setBounds(10, 168, 217, 35);
	contentPane.add(btnberechnen);
}
```


[WR]Ich bin einfach zu nett für diese Welt. MEMO an mich selbst: böser werden *harharhar*
[/WR]


----------



## M_Schaffrath (9. Feb 2012)

In der Tat, mit 
	
	
	
	





```
Thread.sleep()
```
 läuft das Programm so nicht. Macht nach einigem Nachdenken auch Sinn, aber ich habe den Befehl, glaube ich, noch nie verwendet und war davon ausgegangen, dass es so funktionieren könnte.

Wenn ich mit Swing eine Anzeige in regelmäßigen Abständen verändern will, benutze ich dazu die Klasse 
	
	
	
	





```
javax.swing.Timer
```
. Die bekommt einen ActionListener und kann dann sich dann in festgelegten Intervallen selbst ein Event feuern.

Pseudocode:

```
i = 0; // initialisiere Zähler

t = new Timer(500, new ActionListener(){ // ein neuer Timer mit 500 ms Verzögerung
   public void actionPerformed(ActionEvent ae){
      i++; // erhöhe den Zähler um 1
      komponente.setText(String.valueOf(i)); // stell den neuen Zählerwert dar
      if(i == 100) // wenn der Zähler 100 erreicht hat...
         t.stop(); // ...halte den Timer an
   }
});

t.start(); // starte den Timer (z.B. in einem Listener)
```


----------



## Sibylle (9. Feb 2012)

Ein fröhliches Hallo an alle Beitragschreiber,

und vielen Dank für alle bisherigen Hilfen.

Weitere Lösungsvorschläge wurden getestet, leider ohne Erfolg.

Kann es sein, dass es tatsächlich nicht möglich ist, die verzögerte Ausgabe einer For-Laufvariablen in einem Textfeld auszugeben? Es fällt mir schwer, das so hinzunehmen.

Möglicherweise habe ich auch immer wieder denselben Fehler gemacht, der dann dazu führt, dass das Programm nicht so läuft wie gewünscht. 

Ich selbst komme in diesem Fall nicht weiter. Die JAVA-Kenntnisse reichen da einfach nicht aus.
Vielleicht kann ich doch noch ein lauffähiges Programm dem Forum entnehmen.
Würde mich sehr darüber freuen.
Einen schönen Tag.

Gruß

Sibylle


----------



## VfL_Freak (9. Feb 2012)

Moin,



Sibylle hat gesagt.:


> Zum Beitrag von M. Schaffrath:
> Mit System.out.println werden die Zahlen angezeigt.
> Im Textfeld nur wieder die letzte Zahl und das nur, wenn folgende Zeile mit // ihre Wirkung verliert.
> Thread.sleep(1000);



Das ist auch relativ logisch :
der normale Schleifendurchlauf ohne das Sleep geht so schnell, dass du dabei gar nicht erkennen kannst, selbst wenn die Werte richtig in Textfeld geschrieben werden. Erst das Sleep bremst das Ganze soweit runter, da es klappt.

Sonst versuch' doch mal innerhalb der Schleife nicht jeden Wert, sondern nur jeden 10. oder 100. im Textfeld auszugeben!

Gruß
Klaus


----------



## xehpuk (9. Feb 2012)

Ich sehe hier leider keine Eigeninitiative.



Sibylle hat gesagt.:


> Weitere Lösungsvorschläge wurden getestet, leider ohne Erfolg.


Doch, sie funktionieren.



Sibylle hat gesagt.:


> Kann es sein, dass es tatsächlich nicht möglich ist, die verzögerte Ausgabe einer For-Laufvariablen in einem Textfeld auszugeben? Es fällt mir schwer, das so hinzunehmen.


Doch, ist es. Siehe Lösungsvorschläge.



Sibylle hat gesagt.:


> Ich selbst komme in diesem Fall nicht weiter. Die JAVA-Kenntnisse reichen da einfach nicht aus.


Wenn man die Kenntnisse nicht hat, eignet man sie sich mithilfe von Literatur an. Dies können vorzugsweise Bücher oder auch Tutorials aus dem Internet sein. Man kopiert doch nicht einfach Code, den man selbst nicht versteht. ???:L



Sibylle hat gesagt.:


> Vielleicht kann ich doch noch ein lauffähiges Programm dem Forum entnehmen.


Was war an meinem Programm nicht lauffähig?

Übrigens läuft es hier normalerweise nicht so, dass jemand eine Aufgabe stellt und daraufhin eine Komplettlösung folgt. Das ist nicht der Sinn eines (zumindest dieses) Forums. Wenn du nur darauf hinaus bist, sollte das eher in die Jobbörse …


----------



## M_Schaffrath (9. Feb 2012)

In diesem Thread stehen Ansätze, die definitiv das Problem lösen. Wenn deine Umsetzung nicht funktioniert, kannst du den Code posten, damit wir dir bei der Fehlersuche helfen können. Wenn du eine Lösung nicht verstehst, wird sie sicherlich gern erklärt werden.

Aber es ist schon so gedacht, dass am Ende du die Aufgabe gelöst hast, nicht, dass du hier eine Lösung bekommst, die du nur noch kopieren musst.


----------



## Sibylle (9. Feb 2012)

Hallo,

vielen Dank für die Beiträge.

_Wenn ich mit Swing eine Anzeige in regelmäßigen Abständen verändern will, benutze ich dazu die Klasse javax.swing.Timer . Die bekommt einen ActionListener und kann dann sich dann in festgelegten Intervallen selbst ein Event feuern.
_
Leider ist mir die Bedeutung dieser Zeilen nicht klar.
Kannst Du mir bitte mitteilen, wie ich vorzugehen habe, damit genau diese Programmzeilen erstellt werden?
Ich vermute mal, dass ich bereits bei der Erstellung des Frames und der Grafikobjekte Fehler mache.

Gruß

Sibylle


----------



## HimBromBeere (9. Feb 2012)

Kurzgefasst etwa so:


```
public class AnfaengerZeuch implements ActionListener{
	
	Timer timer = new Timer(5, this);
	

	public void doSomething() {
		timer.start();
	}


	// wird vom Timer alle 5ms aufgerufen
	@Override
	public void actionPerformed(ActionEvent e) {
		// mach irgendwas alle 5ms		
	}
}
```


----------



## M_Schaffrath (9. Feb 2012)

Sibylle hat gesagt.:


> Leider ist mir die Bedeutung dieser Zeilen nicht klar.
> Ich vermute mal, dass ich bereits bei der Erstellung des Frames und der Grafikobjekte Fehler mache.



Einen Timer kannst du dir ungefähr so vorstellen, wie einen unsichtbaren JButton, der von Java in regelmäßigen Zeitabständen gedrückt wird. Im Konstruktor vom Timer wird die Größe dieses Zeitabstandes und ein ActionListener angegeben, der bestimmt, was passiert, wenn der Timer ausgelöst wird:
Pseudocode:

```
Timer t = new Timer(1000, // Verzögerung des Timers in ms
                    new ActionListener(){ // Listener, der bestimmt, was der Timer tun soll
                       public void actionPerformed(ActionEvent ae){
                          // Jedesmal, wenn der Timer ausgelöst wird, wird dieser Anweisungsblock ausgeführt
                       }
                    });
```

Damit der Timer anfängt zu laufen, muss seine Methode 
	
	
	
	





```
.start()
```
 aufgerufen werden. Ab diesem Zeitpunkt wird er die Anweisung in seinem ActionListener immer wieder ausführen und dazwischen so lange warten, wie seine Verzögerung eingestellt ist. Andere Teile des Programms laufen in dieser Zeit ungestört weiter. Erst wenn die Methode 
	
	
	
	





```
.stop()
```
 aufgerufen wird, hört der Timer auf, regelmäßig seine Anweisungen auszuführen.

Versuch es am besten erst einmal mit einem kleinen Testprogramm:

```
// TODO Imports
   
public class TimerTest{
   
   private JPanel contentPane; // Content Pane des Frames
   private JButton start; // Start-Knopf
   private JButton stop; // Stop-Knopf
   private Timer timer; // Timer
   
   public static void main(String[] args){ // Hauptprogramm, erschafft eine Instanz der Klasse
      EventQueue.invokeLater(new Runnable(){
         public void run(){
            try{
               TimerTest frame = new TimerTest();
               frame.setVisible(true);
            } catch(Exception e){
               e.printStackTrace();
            }
         }
      });
   }
   
   public TimerTest(){ // Konstruktor
      this.contentPane = new JPanel(); // neues Panel
      this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
      this.setContentPane(contentPane); // Panel als Content Pane zum Frame hinzufügen
      
      this. timer = // TODO timer initialisieren
      // der Timer soll jede Sekunde "Hello World!" über die Methode System.out.println() ausgeben
      
      this.start = new JButton("Start"); // neuen Button mit der Aufschrift "Start" erschaffen
      // TODO ActionListener hinzufügen, der timer.start() aufruft
      this.contentPane.add(this.start); // Button einfügen

      this.stop = new JButton("Stop"); // neuen Button mit der Aufschrift "Stop" erschaffen
      // TODO ActionListener hinzufügen, der timer.stop() aufruft
      this.contentPane.add(this.stop); // Button einfügen
   }
}
```

Das bisher Gezeigte sollte es dir ermöglichen, die TODOs auszufüllen. Wenn das Programm macht, was es soll und du das Konzept des Timers verstanden hast, kannst du dann überlegen, wie du die Technik einsetzen kannst, um in regelmäßigen Abständen den Text einer Komponente zu ändern und wie du den Timer ohne Button anhalten willst.


----------

