簡體   English   中英

我想在小程序中添加計時器

[英]I want to add timer in my applet

我制作了CountDown.java文件,並嘗試將我的Word-trouble.java文件(它是主小程序)添加為CountDown ct = new CountDown(); 但是它沒有在主小程序中顯示計時器。

這是編碼:

package pack.urdu;
import java.awt.*; //windows toolkit

import java.applet.*; //applet support

public class CountDown extends Applet implements Runnable{

int counter; Thread cd;

public void start() { // create thread

counter = 60; cd = new Thread(this); cd.start();

}

public void stop() { cd = null;}

public void run() {  // executed by Thread

while (counter>0 && cd!=null) {

try{Thread.sleep(1000);} catch (InterruptedException e){}

--counter; repaint(); //update screen

}

}

public void paint(Graphics g) {

g.drawString(String.valueOf(counter),25,75);

}

}

我看到很多程序員在犯一個錯誤:您將經過時間的計算與刷新時間的計算混淆了。 如果由於線程爭用而使睡眠時間長於一秒鍾,那么您的計時器將漂移。

只需記錄開始時間,而不是跟蹤每秒鍾遞增的計數器:

long startTime = System.currentTimeMillis();

然后,您的繪制方法變為:

public void paint(Graphics g) {
    int elapsedSeconds = (int)(System.currentTimeMillis()-startTime)/1000
    g.drawString(String.valueOf(elapsedSeconds),25,75);
}

您可以根據需要多次調用此方法,並且可以始終顯示正確的經過的秒數。 無需在任何指定時間增加任何內容。

您唯一要做的另一件事就是安排屏幕刷新。 (我想說的是,您只需要在用戶查看屏幕時刷新屏幕即可:-),但是由於我們不知道我們需要更頻繁地刷新屏幕)。 其機制可能取決於圖形庫。 一個懶惰的想法是每秒刷新十次,並且在大多數情況下屏幕都是正確的。

如果確實希望有一個線程發送重繪事件,則應在計時器單擊新值時發送這些事件,從而每秒僅發送一個。 這是通過以下方式完成的:

while (stillRunning) {
    long elapsedTime = System.currentTimeMillis() - startTime;
    long timeTillNextDisplayChange = 1000 - (elapsedTime % 1000);
    Thread.sleep(timeTillNextDisplayChange);
    repaint();
}

請注意,您不要睡1000ms! 如果您的系統運行良好,則這將非常接近1000ms,但比考慮到(1)可能由線程爭用引起的線程啟動延遲以及(2)此循環的處理時間(即相當小)。 無論如何,以這種方式計算睡眠時間將防止計時器漂移,並確保您的顯示值隨着秒值的變化而更新。

請參閱我的網站上有關計時器常見誤解的擴展討論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM