2012-03-01 20 views
-3

インターネット上のどこからでもこのストップウォッチのJavaコードが見つかりましたが、動作していないようです。私はそれを動作させるためにこのコードを修正する方法を知りました。開始、停止、リセットする機能があり、時:分:秒.milliseconds(例: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()); 
} 
} 
+1

「作業していない」とはどういう意味ですか?このコードから何を期待していますか? –

+1

宿題?その場合は、タグを追加してください。 – trashgod

+0

@SérgioMichelshh:mm:ss:ms –

答えて

3

このexamplejavax.swing.Timerを起動および停止する方法を示しています。書式設定には、いくつかの方法があります。hereリセットは練習として残されます。

2

教授のようなレベルでは、Webから取得した例では使用されていないネストされたループを使用する必要があります。

私はあなたに完全な答えを与えるつもりはありませんが、非常に単純です。最も外側のループは時間単位、1時間単位は分単位、1単位は分単位、秒単位はミリ秒単位です。最も内側のループ(ミリ秒)は、現在の時刻を出力します。このような

何か:

// 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ミリ秒の遅延を追加し、設定は完了です! :)

+0

と書式設定しなければならないカウントアップタイマーにしたいです。これを使ってJavaBeanを作成します。 –

0

ストップウォッチを作成する場合は、スレッドを作成する必要があります。 Java APIには、スレッドのすべての機能が記述されています。そうしなければ、タイマーを一時停止することができなくなるため、これは必要です。これは、システムがカウントに完全なランタイムを費やすためです。

また、指定したスクリプトは、特定の計算に要した時間を判断するために使用されます。タイミング自体は重要ではありません。

2つのクラスを作成することをお勧めします.1つはタイマー用、もう1つはGUI用です。 GUIにラベル、開始、停止、リセットのボタンをつけてください。

次に、timer-classが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クラスでは、あなたが(StopWatch.stopを呼び出す停止、「startThread」と呼んで開始するだろう)。 (これはスレッド関数です)、resetを呼び出してreset()を呼び出します。

これは基本的なストップウォッチから始めるはずです。そのuseageのための(悪い)例:

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

    } 

実際にthreadclassの外にcurrentTimeMillis上の計算を行うことがより賢明だろう。

+0

私は 'public static void main(String [] args)を使ってみました。{ StopWatch s = new StopWatch(); s.startThread(); System.out.println(s。時間をもらう()); } 'このコード。コンソールでは0になりました。それはなぜです? –

+0

スレッドを開始した直後にgetTimeを照会すると、まだ値が変更されていない可能性があります。 – bas

関連する問題