【问题标题】:How to program for a stopwatch [closed]如何为秒表编程[关闭]
【发布时间】:2012-03-20 12:40:17
【问题描述】:

我从 Internet 上的某个地方找到了这个秒表 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());
}
}

【问题讨论】:

  • 您所说的“不工作”到底是什么意思?您对这段代码有什么期望?
  • 家庭作业?如果是,请添加标签。
  • @SérgioMichels 我希望它是一个计数计时器,其格式应为 hh:mm:ss:ms

标签: java javabeans


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据您的作业级别,听起来您的教授希望您使用嵌套循环,而您从网络上获取的示例中没有使用嵌套循环。

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

    类似这样的:

    // 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 毫秒的延迟,你就完成了! :)

    【讨论】:

    • 我想用它来创建一个JavaBean。
    【解决方案3】:

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

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

    我建议你创建 2 个类,1 个用于计时器,1 个用于 GUI。制作带有标签、开始、停止和重置按钮的 GUI。

    接下来,确保计时器类 EXTENDS THREAD(或实现 Runnable)并使其成为线程。接下来实现停止线程或启动线程的功能(您的开始/停止按钮)。之后重置应该很容易(只需将计时器设置回 0)。

    秒表类可能如下所示:

    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(); (这是一个线程函数)并让 reset 调用 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 进行计算会更明智。

    【讨论】:

    • 我试过使用public static void main(String[] args) { StopWatch s = new StopWatch(); s.startThread(); System.out.println(s.getTime()); }这个代码。但它在控制台上导致 0。为什么会这样?
    • 如果在启动线程后直接查询getTime,它的值可能还没有改变。
    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多