# Stoppuhr



## bratwurst (26. Apr 2005)

Hallöle,

gleich vorweg, ich bin noch relativer Anfänger, brauche aber Hilfe bei einer Projektarbeit, da unser Lehrer uns trotz mangelnder Kenntnisse unsererseits ins kalte Wasser geworfen hat.

Für diese Projektarbeit benötige ich eine Stoppuhr, die bei einem Klick auf Start zu zählen beginnt, und bei einem Klick auf Stop aufhört zu zählen. Dieser Wert soll dann in der Form "Sekunden" oder hh:mm:ss vorliegen. Nur leider bekomme ich das mit dem Stoppen nicht wirklich hin.

Hat jemand ne Idee eines Ansatzpunktes oder vielleicht mal irgendwo nen fertigen Codeschnippel?
Ich habe dank google zwar schon einiges gefunden, jedoch hatte ich massive Schwierigkeiten bei der Implementierung des Codes.


Wäre schön, wenn mir da jemand helfen könnte.


Vielen Dank im Vorraus,
bratwurst


----------



## thE_29 (26. Apr 2005)

du brauchst java.util.Timer und java.util.TimerTask!

Nen Button der deinen Timer einschaltet, der alle sekunden, millsekunden, etc (was du willst) abläuft und die Zeit raufzählt!

Drückst du nochmal auf den button und der timer ist aktiv, so stoppe ihn und gib aus!

Such hier im Forum nach timer und timertask und du wirst sicher ein Bsp zu den 2 dingern finden!


----------



## bratwurst (26. Apr 2005)

Wer suchet der findet  :wink: 

Dank deiner Hinweise habe ich nun folgenden Schnippel:


```
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*;
import java.util.Timer; 
import java.util.TimerTask;

public class click extends Frame
{ 
	

   int iZeit=-1; 

   Button btStart = new Button("Starten"); 
 
   Button btStop = new Button("Stoppen"); 

   private JLabel lbZeit = new JLabel("Nix ist passiert"); 

   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);} 
    
}
```

Nur leider erhalte ich dann die Fehlermeldung



> Exception in thread "main" java.lang.NoSuchMethodError: main




Damit kann ich nun leider nichts anfangen  :cry:


----------



## Wildcard (26. Apr 2005)

Wenn darin keine main-Methode ist kannst du es auch nicht ausführen!
Entweder von einer anderern Klasse instanzieren, oder eine main schreiben...


----------



## bratwurst (26. Apr 2005)

Und wenn du jetzt noch einen Tip für mich hättest, wie ich das mache, heirate ich dich  :wink: 

Ne Scherz...aber dafür, dass wir das im Unterricht gerade mal 45 Minuten besprochen haben, reichen meine Kenntnisse leider bei Weitem nicht aus.


----------



## Wildcard (26. Apr 2005)

Füg der Klasse eine main an:

```
public static void main(Sting[] args)
{
    //Keine Ahnung wo du das her hast, aber Klassen werden groß geschrieben
    click c = new click();
    c.init();
    c.setVisible(true);
}
```


----------



## vaDer.bln (26. Apr 2005)

Find ich ja ziemlich hart das ihr nach 45min nicht mal main methode etc besprochen habt und dann ein Projekt macht bei der ihr  Swing AWT und Timer braucht.
oder du hast net aufgepasst


----------



## thE_29 (26. Apr 2005)

Oder er war nur 45 min dort von 4 stunden


----------



## vaDer.bln (26. Apr 2005)

Ach so zur info. Die Darstellung ist etwas falsch geraten glaub ich und es ist auch keine hh.mm.ss angegeben aber das sollte dir bestimmt erstmal einen kleinen überblick verschaffen. Falls du weitere fragen hast kannst sie ja posten


----------



## The_God (26. Apr 2005)

geht auch über einen Thread, soll der Timer das eigentlich Programm nicht zuviel belasten, stell einfach die Priorität entsprechend ein.

Den Thread kannst ja mit sleep oder wait (weiss nicht mehr genau ...) anhalten. so dass er z.b. jede sekunde ein Label aktualisiert.


z.B.:


```
package start;

import java.lang.Runnable;
import javax.swing.JFrame;

public class Untitled2 implements Runnable {
  static GregorianCalendar ca = new GregorianCalender();

  public void run() {
    ca = new GregorianCalendar();
    /...da kannst halt dann das rausfiltern was du ausgibst.../  

 }
}
```


----------



## thE_29 (26. Apr 2005)

http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html



> ..If you need to update a component after a delay (whether or not your code is currently executing in an event listener), use a timer to do so.
> 
> If you need to update a component at a regular interval, use a timer.



Überall wo kein Thread gebraucht wird, wegen Geschwindigkeit oder sonstiges, sollte man Timer nehmen (irgendwo stand das mal bei einem Artikel von Sun ..) 
Da die Thread´s und Swing net gut zusammenspielen, bzw Swing net Thread safe ist (swing GUI kann blockiert, oder ähnliches werden)


----------



## vaDer.bln (27. Apr 2005)

oder halt Klase Swing.Utilities (invoke....) nutzen wenn man nicht auf Threads verzichten möchte


----------

