# Zeit-Zähler



## Loooser (4. Feb 2005)

Hallo,

ich brauche einen Thread, der die Sekunden zählt.
Diese Sekunden muss ich in meinem Applet abfragen können.
Ich weiß leider nicht wie ich das in Java machen kann.


----------



## foobar (4. Feb 2005)

Erzeuge einen TimerTask der alle 1000 Millisekunden einen int inkrementiert.

http://www.javaalmanac.com/egs/java.util/ScheduleRepeat.html


----------



## Loooser (4. Feb 2005)

Das hab ich mir auch gedacht aber das geht irgendwie nicht.


```
import java.util.Timer;
import java.util.TimerTask;

class ZeitThread extends Thread implements Runnable{
	
	private Timer zeit = new Timer(true);
	private TimerTask zaehler = new TimerTask(){
		int i = 0;
		
		public void run(){
			System.out.println(i = i + 1);
		}};

	public ZeitThread(){
		this.setDaemon( true );
	}

	public void run(){
		while (true){
			zeit.schedule(zaehler, 3000, 1000);}}
}
```

Ich habs so Probiert, aber dann kommt der Fehler:

java.lang.IllegalStateException: Task already scheduled or cancelled
	at java.util.Timer.sched(Unknown Source)
	at java.util.Timer.schedule(Unknown Source)
	at ZeitThread.run(ZeitThread.java:20)
	at Clickbattle.init(Clickbattle.java:38)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)


Kann es daran liegen, dass ich direkt beim Start ein Objekt von dem Thread erzeuge und auch gleich bei der Initialisierung ausführen und stoppen will?


----------



## Loooser (4. Feb 2005)

OK...
Eben hab ich den (dummen) Fehler gefunden.
Also das is ja jetzt ganz toll. Der zählt jede Sekunde und läuft einwandfrei,
aber wie kann ich ihn für unbestimmte Zeit unterbrechen?
Ich will ihn Starten wenn ich auf den Start-Button drücke (geht ja schon),
aber wenn ich auf Stop klicke soll er angehalten werden.


----------



## bambi (4. Feb 2005)

Schau' mal hier:

http://java.sun.com/j2se/1.5.0/docs/api/

die cancel() methode hoert sich doch nicht so schlecht an


----------



## Loooser (9. Feb 2005)

Also ich habs jetzt wie folgt:


```
public class Clickbattle extends java.applet.Applet{
 
	int iZeit=-1;
 
	private JButton btStart = new JButton("Start");
	private JButton btStop = new JButton("Stop");
	private JLabel lbZeit = new JLabel();

	private Timer zeit = new Timer(true);
	private TimerTask zaehler = new TimerTask(){
		public void run(){
			iZeit = iZeit + 1;
			lbZeit.setText(String.valueOf(iZeit));}};

	private ActionListener al;

	public void init(){
		this.setSize(600,600);
		this.setBackground(Color.LIGHT_GRAY);
		this.setLayout(null);
 
		setKomps();
 
		implementActionListener();}
 
	private void setKomps(){
		btStart.setBounds(10,20,100,20);
		this.add(btStart);
		btStop.setBounds(10,20,100,20);
		this.add(btStop);
		btStop.setVisible(false);
		lbZeit.setBounds(200,20,200,20);
		this.add(lbZeit);
		lbZeit.setFont(new Font("Arial", Font.BOLD, 20));
		lbZeit.setHorizontalAlignment(SwingConstants.CENTER);
		lbZeit.setVerticalAlignment(SwingConstants.CENTER);}

	private void runningKomps(){
		btStart.setVisible(false);
		btStop.setVisible(true);}
 
	private void stoppedKomps(){
		btStop.setVisible(false);
		btStart.setVisible(true);}
 
	private void implementActionListener(){
		al = new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if (btStart == e.getSource()){
					runningKomps();
					zeit.schedule(zaehler, 0, 1000);}
				else if (btStop == e.getSource()){
					stoppedKomps();
					zeit.cancel();
					iZeit = -1;}}};
		btStart.addActionListener(al);
		btStop.addActionListener(al);}
 }
```

Ich muss aber nachdem ich gestoppt hab, auch wieder starten können und da kommt leider ein Fehler.
Wie könnte man es denn machen???


----------



## scriptCoad (8. Mrz 2005)

hmm ...hast Du schon ne Lösung gefunden?


----------



## Spacerat (8. Mrz 2005)

Da sollte man wie folgt vorgehen...

1. Starten:
    - TimerTask zuweisen.
    - Timer zuweisen
    - Timer "shedulen"

2. Stoppen:
    - cancel() Timer
    - cancel() TimerTask
    - Timer = null
    - TimerTask = null

Wichtig ist, das die Reihenfolge eingehalten wird. Man beachte das diese beim stoppen umgedreht ist.

cu


----------



## Kian (12. Mrz 2005)

Versuch mal das:



```
boolean count = false; // wird durch start u. stop - Button gesetzt

int i = 0;

public void count() // ausgeführt durch button
{

    new Thread(){{start();}
        public void run()
        {

          i = 0; // Variable wird zurückgesetzt

           while(count == true)
           {

               i++; // i = i + 1;

               label1.setText(""+i); // Variable wird z.B. in einem Label ausgegeben

               try
               {
                 sleep(1000); // Schleife "schläft" für 1 sec
               }catch(InterruptedException ixo){}

           }

        }
    };

}
```

Lass lieber die Finger vom Timer, für sowas Simples ist der einfach unnötig, hier brauchst du nur eine einzige Methode, Runnable brauchst du nicht zu implementieren in dem Fall!

Oder wolltest du eigentlich was anderes machen?


----------

