Zeit-Zähler

Status
Nicht offen für weitere Antworten.

Loooser

Mitglied
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.
 

Loooser

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

Code:
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

Mitglied
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.
 

Loooser

Mitglied
Also ich habs jetzt wie folgt:

Code:
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???
 
S

Spacerat

Gast
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

Aktives Mitglied
Versuch mal das:


Code:
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?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben