# Stopuhr realisieren



## Oni (20. Sep 2004)

Ich möchte eine stoppuhr machen bzw habe ich das schon. ich kann mit start-button die stoppuhr starten und mit einem stop-button anhalten aus der differenzzeit ermittel ich die zeit in std, min sek und ms. das ganz lass ich mir dann anzeigen.

jetzt würde ich gerne das ganz ständig aktualisieren damit die stopuhr richtig läuft und nicht nur die endzeit anzeigt.
kann ich das nur über threads lösen oder gibt es da eine andere möglichkeit paint ständig neu aufzurufen. 


```
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;

public class Stoppuhr extends Container implements ActionListener, WindowListener
{
	private Button start, stop, clear;
     private float ergebnis = 0, milli = 0, sekWert = 0;
     private long  sek, min, std, tag, jahr, timeStop, timeDiff, timeStart;
     private static long time = 0;
     private int xStop = 0, milli2 = 0, xStart = 0;

     public static void main(String[] args)
     	{
          Stoppuhr stoppuhr = new Stoppuhr();
          Frame f = new Frame();

          f.setTitle("Stoppuhr");
          f.add(stoppuhr);
          f.setLocation(200, 100);
          f.setSize(500, 550);
          f.setVisible(true);
          f.addWindowListener(stoppuhr);
          f.setBackground(Color.lightGray);
          }

     public Stoppuhr()
     	{
          setLayout(null);
          setBackground(Color.lightGray);
          start = new Button("Start");
          add(start);
          start.setBounds(150, 10, 50, 25);
          start.addActionListener(this);

          stop = new Button("Stop");
          add(stop);
          stop.setBounds(210, 10, 50, 25);
          stop.addActionListener(this);

          clear = new Button("Clear");
          add(clear);
          clear.setBounds(270, 10, 50, 25);
          clear.addActionListener(this);
          }

     public void windowClosing(WindowEvent event)
     	{
          System.exit(0);
          }

     public void windowIconified(WindowEvent event)
     	{
          }

     public void windowOpened(WindowEvent event)
     	{
          }

     public void windowClosed(WindowEvent event)
     	{
          }

     public void windowDeiconified(WindowEvent event)
     	{
          }

     public void windowActivated(WindowEvent event)
     	{
          }

     public void windowDeactivated(WindowEvent event)
     	{
          }

     public void actionPerformed(ActionEvent event)
     	{
          if(event.getSource() == start)
          	{
               time = System.currentTimeMillis();
               timeStart = time;
               xStart = 1;
               }
          if(event.getSource() == stop)
          	{
               time = System.currentTimeMillis();
               timeStop = time;
               xStop = 1;
               time = 0;
               }
          if(event.getSource() == clear)
          	{
               timeStart = 0;
               timeStop = 0;
               timeDiff = 0;
               time = 0;
               sek = 0;
               min = 0;
               std = 0;
               tag = 0;
               milli2 = 0;
               xStart = 0;
               xStop = 0;
               }
	        repaint();
          }

     public void paint(Graphics g)
     	{
          if((xStop == 1) && (xStart == 1))
          	{
	          timeDiff = timeStop - timeStart;
               xStart = 0;
               xStop = 0;
               }

          if(timeDiff > 86400000)
          	{
               sek = timeDiff / 1000;
               min = sek / 60;
          	sek = sek % 60;
              	std = min / 60;
              	min = min % 60;
               tag = std / 24;
               std = std % 24;
               xStart = 0;
               xStop = 0;
               }
          else
          	if(timeDiff > 3600000)
               	{
                    sek = timeDiff / 1000;
               	min = sek / 60;
                    sek = sek % 60;
                    std = min / 60;
                    min = min % 60;
                    xStart = 0;
               	xStop = 0;
                    }
            	else
               	if(timeDiff > 60000)
                    	{
                    	sek = timeDiff / 1000;
                         min = sek / 60;
                         sek = sek % 60;
                         xStart = 0;
               		xStop = 0;
                         }
                 	else
                      	if(timeDiff > 1000)
	                         {
	                         sek = timeDiff / 1000;
                              xStart = 0;
               			xStop = 0;
                              }

          milli = timeDiff;
          milli = milli / 1000;
          sekWert = sek + (min * 60) + (std * 60 * 60) + (tag * 24 * 60 * 60);
          milli = milli - sekWert;
          milli = Math.round(milli * 100) / 100.0f;
          milli = milli * 100;
          milli2 =(int)milli;

          DecimalFormat df = new DecimalFormat("00");
          g.drawLine(200, 51, 300, 51);   // oben
          g.drawLine(200, 52, 300, 52);   // oben
          g.drawLine(200, 67, 300, 67);   // mitte Horizontal
          g.drawLine(200, 83, 300, 83);   // unten
          g.drawLine(200, 84, 300, 84);   // unten
          g.drawLine(200, 51, 200, 84);   // links
          g.drawLine(201, 52, 201, 83);   // links
          g.drawLine(300, 51, 300, 84);   // rechts
          g.drawLine(299, 52, 299, 83);   // rechts
          g.drawLine(225, 52, 225, 83);   // mitte V1
          g.drawLine(251, 52, 251, 83);   // mitte V2
          g.drawLine(278, 52, 278, 83);   // mitte V2

          g.drawString(" Std " + " Min "  + " Sek " + " Ms ", 202, 64);
          g.drawString("gestoppte Zeit:  ", 114, 72);
          g.drawString("" + df.format(std) , 206, 80);
          g.drawString("" + df.format(min) , 231, 80);
          g.drawString("" + df.format(sek) , 258, 80);
          g.drawString("" + df.format(milli2), 282, 80);

            }
}
```


----------



## P3AC3MAK3R (20. Sep 2004)

Die Timer-Klasse könnte was für Dich sein:

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/Timer.html


----------



## Oni (20. Sep 2004)

Hab mal im i-net geguckt und auch was zur class timer gefunden. aber wie binde ich die jetzt ein muss ich dafür eine neue class ersteln, oder kann ich das irgendwie direkt einbinden?


```
public static void main( String args[] )
  {
    Timer timer = new Timer();
  
    timer.schedule( new Task(), 1, 1 );
  }
}
```

ich würde das jetzt so probieren funktioniert allerdings nicht. warum ist für mich als anfänger nicht wirklich klar.


```
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import java.util.*;

public class Stoppuhr extends Container implements ActionListener, WindowListener
{
	private Button start, stop, clear;
     private float ergebnis = 0, milli = 0, sekWert = 0;
     private long  sek, min, std, tag, jahr, timeStop, timeDiff, timeStart;
     private static long time = 0;
     private int xStop = 0, milli2 = 0, xStart = 0, neu = 1;

     public static void main(String[] args)
     	{
          Timer timer = new Timer();                   // <-------------------------
          Stoppuhr stoppuhr = new Stoppuhr();
          Frame f = new Frame();

          timer.schedule( new Task(), 1000);
          f.setTitle("Stoppuhr");
          f.add(stoppuhr);
          f.setLocation(200, 100);
          f.setSize(500, 550);
          f.setVisible(true);
          f.addWindowListener(stoppuhr);
          f.setBackground(Color.lightGray);

          }

     public Stoppuhr()
     	{
          setLayout(null);
          setBackground(Color.lightGray);
          start = new Button("Start");
          add(start);
          start.setBounds(150, 10, 50, 25);
          start.addActionListener(this);

          stop = new Button("Stop");
          add(stop);
          stop.setBounds(210, 10, 50, 25);
          stop.addActionListener(this);

          clear = new Button("Clear");
          add(clear);
          clear.setBounds(270, 10, 50, 25);
          clear.addActionListener(this);
          }

     public void windowClosing(WindowEvent event)
     	{
          System.exit(0);
          }

     public void windowIconified(WindowEvent event)
     	{
          }

     public void windowOpened(WindowEvent event)
     	{
          }

     public void windowClosed(WindowEvent event)
     	{
          }

     public void windowDeiconified(WindowEvent event)
     	{
          }

     public void windowActivated(WindowEvent event)
     	{
          }

     public void windowDeactivated(WindowEvent event)
     	{
          }

     public void actionPerformed(ActionEvent event)
     	{
          if(event.getSource() == start)
          	{
               timer.schedule( new Stoppuhr(), 1, 1); // <-------------------------
               time = System.currentTimeMillis();
               timeStart = time;
               xStart = 1;
               }
          if(event.getSource() == stop)
          	{
               timer.cancel();             // <-------------------------------
               time = System.currentTimeMillis();
               timeStop = time;
               xStop = 1;
               time = 0;
               }
          if(event.getSource() == clear)
          	{
               timeStart = 0;
               timeStop = 0;
               timeDiff = 0;
               time = 0;
               sek = 0;
               min = 0;
               std = 0;
               tag = 0;
               milli2 = 0;
               xStart = 0;
               xStop = 0;
               }
	        repaint();
          }

     public void paint(Graphics g)
     	{
          if((xStop == 1) && (xStart == 1))
          	{
	          timeDiff = timeStop - timeStart;
               xStart = 0;
               xStop = 0;
               }

          if(timeDiff > 86400000)
          	{
               sek = timeDiff / 1000;
               min = sek / 60;
          	sek = sek % 60;
              	std = min / 60;
              	min = min % 60;
               tag = std / 24;
               std = std % 24;
               xStart = 0;
               xStop = 0;
               }
          else
          	if(timeDiff > 3600000)
               	{
                    sek = timeDiff / 1000;
               	min = sek / 60;
                    sek = sek % 60;
                    std = min / 60;
                    min = min % 60;
                    xStart = 0;
               	xStop = 0;
                    }
            	else
               	if(timeDiff > 60000)
                    	{
                    	sek = timeDiff / 1000;
                         min = sek / 60;
                         sek = sek % 60;
                         xStart = 0;
               		xStop = 0;
                         }
                 	else
                      	if(timeDiff > 1000)
	                         {
	                         sek = timeDiff / 1000;
                              xStart = 0;
               			xStop = 0;
                              }

          milli = timeDiff;
          milli = milli / 1000;
          sekWert = sek + (min * 60) + (std * 60 * 60) + (tag * 24 * 60 * 60);
          milli = milli - sekWert;
          milli = Math.round(milli * 100) / 100.0f;
          milli = milli * 100;
          milli2 =(int)milli;

          DecimalFormat df = new DecimalFormat("00");
          g.drawLine(200, 51, 300, 51);   // oben
          g.drawLine(200, 52, 300, 52);   // oben
          g.drawLine(200, 67, 300, 67);   // mitte Horizontal
          g.drawLine(200, 83, 300, 83);   // unten
          g.drawLine(200, 84, 300, 84);   // unten
          g.drawLine(200, 51, 200, 84);   // links
          g.drawLine(201, 52, 201, 83);   // links
          g.drawLine(300, 51, 300, 84);   // rechts
          g.drawLine(299, 52, 299, 83);   // rechts
          g.drawLine(225, 52, 225, 83);   // mitte V1
          g.drawLine(251, 52, 251, 83);   // mitte V2
          g.drawLine(278, 52, 278, 83);   // mitte V2

          g.drawString(" Std " + " Min "  + " Sek " + " Ms ", 202, 64);
          g.drawString("gestoppte Zeit:  ", 114, 72);
          g.drawString("" + df.format(std) , 206, 80);
          g.drawString("" + df.format(min) , 231, 80);
          g.drawString("" + df.format(sek) , 258, 80);
          g.drawString("" + df.format(milli2), 282, 80);

          g.drawString("Startzeit (Millisekunden seit 01.01.1970): " + timeStart, 50, 400);
          g.drawString("Stopzeit (Millisekunden seit 01.01.1970): " + timeStop, 50, 420);
          g.drawString("Differenz in Millisekunden: " + timeDiff, 50, 440);
          }
}
```


----------



## Oni (20. Sep 2004)

So ich habe das jetzt mit ein bisschen hilfe hinbekommen.

und habe noch eine frage: 

kann ich das irgendwie so machen das von repaint() nur ein drawString aktualisiert wird?


```
g.drawString(" Std " + " Min "  + " Sek " + " Ms ", 202, 64);
```


----------



## Oni (21. Sep 2004)

gibt es keine möglichkeit?


----------



## Beni (21. Sep 2004)

Nein. Du musst deine paint-Methode so schreiben, dass sie nach einem Aufruf aus einer leeren Fläche das Bild herstellt, das du haben willst.


----------



## Oni (22. Sep 2004)

und wie mache ich das? kann ich das in den vorhanden code einbauen?


----------

