如何为秒表编程

时间:2012-03-01 23:50:59

标签: java javabeans

我从互联网上的某个地方找到了这个秒表java代码,但它似乎没有起作用。我想知道如何修复此代码以使其工作。它应该具有启动,停止和重置的功能,并且应该将时间显示为小时:分钟:秒。毫秒(例如:12:35:17.26)。请帮帮我。

public class StopWatch {

private long startTime = 0;
private long stopTime = 0;
private boolean running = false;


public void start() {
    this.startTime = System.currentTimeMillis();
    this.running = true;
}


public void stop() {
    this.stopTime = System.currentTimeMillis();
    this.running = false;
}


//elaspsed time in milliseconds
public long getElapsedTime() {
    long elapsed;
    if (running) {
         elapsed = (System.currentTimeMillis() - startTime);
    }
    else {
        elapsed = (stopTime - startTime);
    }
    return elapsed;
}


//elaspsed time in seconds
public long getElapsedTimeSecs() {
    long elapsed;
    if (running) {
        elapsed = ((System.currentTimeMillis() - startTime) / 1000);
    }
    else {
        elapsed = ((stopTime - startTime) / 1000);
    }
    return elapsed;
}




//sample usage
public static void main(String[] args) {
    StopWatch s = new StopWatch();
    s.start();
    //code you want to time goes here
    s.stop();
    System.out.println("elapsed time in milliseconds: " + s.getElapsedTime());
}
}

3 个答案:

答案 0 :(得分:3)

example显示了如何启动和停止javax.swing.Timer。显示了几种格式化方法here。重置留作练习。

答案 1 :(得分:2)

根据您的作业级别,听起来像您的教授希望您使用嵌套循环,这些循环在您从Web中获取的示例中未使用。

我不会给你完整的答案,但它很简单:最外面的循环是几个小时,一个小时内是几分钟,一个是几分钟内几秒,一个是几秒内几毫秒。最内部循环(毫秒)是打印当前时间的循环。

这样的事情:

// 24 hours in a day
for(int hours = 0; hours < 24; hours++)
{
    // 60 mins in an hours
    for(int minutes = 0; minutes < 60; minutes++)
    {
       // 60 secs in a min
       for(int seconds = 0; seconds < 60; seconds++)
       {
           // 1000 ms in a sec.
           for(int ms = 0; ms < 1000; ms++)
           {
               System.out.println(hours + ":" + minutes + ":" + seconds + "." + ms);
           }
       }
    }
}

现在让它漂亮并在最里面的循环中添加1毫秒的延迟,你就完成了! :)

答案 2 :(得分:0)

如果你想制作一个秒表,你必须制作一个线程。 Java API声明了线程的所有功能。这是必要的,否则您将无法暂停计时器。这是因为系统在计数上花费了完整的运行时间。

此外,您提供的脚本用于确定某个计算所花费的时间,而不是时间本身。

我建议你制作2个类,1个用于计时器,1个用于GUI。使用标签,启动,停止和重置按钮制作GUI。

接下来,确保定时器类EXTENDS THREAD(或实现Runnable)并使其成为一个线程。接下来实现函数来停止线程或启动线程(开始/停止按钮)。之后重置应该很简单(只需将定时器设置回0)。

StopWatch-class看起来像这样:

public class Stopwatch extends Thread 
{
    private long startTime;
    private boolean started;

    public void startThread()
    {
        this.startTime = System.currentTimeMillis();
        this.started = true;
        this.start();
    }

    public void run()
    {
        while (started)
        {
            // empty code since currentTimeMillis increases by itself
        }
    }


    public int[] getTime()
    {
        long milliTime = System.currentTimeMillis() - this.startTime;
        int[] out = new int[]{0, 0, 0, 0};
        out[0] = (int)(milliTime / 3600000      );
        out[1] = (int)(milliTime / 60000        ) % 60;
        out[2] = (int)(milliTime / 1000         ) % 60;
        out[3] = (int)(milliTime)                 % 1000;

        return out;
    }

    public void stopThread()
    {
        this.started = false;
    }
}

在GUI类中,您将启动调用'startThread',停止调用StopWatch.stop(); (这是一个Thread函数)并重置调用reset()。

这应该让你开始使用基本的秒表。其用法的一个(坏)示例:

public static void main(String[] args) throws InterruptedException
    {
        Stopwatch s = new Stopwatch();

        s.startThread();

        while (true)
        {
            int[] curTime = s.getTime();
            System.out.println(curTime[0] + " : " + curTime[1] + " : " + curTime[2] + " : " + curTime[3]);
        }

    }

在线程类之外的currentTimeMillis上进行计算实际上更为明智。