如何为秒表编程[关闭]

Posted

技术标签:

【中文标题】如何为秒表编程[关闭]【英文标题】: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 【参考方案1】:

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

【讨论】:

【参考方案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,它的值可能还没有改变。

以上是关于如何为秒表编程[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何为 iPhone 制作聊天客户端 [关闭]

JS - 如何为我的秒表编写时间限制功能?

如何为音频应用程序/插件模拟真空管的声音? [关闭]

角度为 8 的秒表 [关闭]

如何为“动画:真”添加完成处理程序/关闭

不那么冗长的秒表[关闭]