簡體   English   中英

Java中的倒數計時器

[英]Recurring Countdown Timer in Java

我正在嘗試在現有的公共課堂中實施倒數計時器,但我有幾個問題。

概述:我想在程序中有一個計時器,一旦程序初始化,該計時器將從60(秒)開始遞減計數。

如果計時器達到零,則程序退出。

如果用戶在60秒的時間范圍內滿足某些參數,計時器將重置為60,顯示一組新的參數,然后再次開始倒數計時。 它應該能夠執行無數次,直到用戶在60秒內不符合參數。

計時器還將有某種(TBD)GUI表示形式,最有可能是數字倒數或JProgressBar。

我是編程的新手(大約3個月),自學成才,仍然學習很多(所以要謙虛):)

我的問題是:

  1. 實現此目的的最佳方法是什么?

  2. 我假設這需要在線程中運行?

  3. 計時器可以輕松配置嗎? (不重要,只是很有趣)

謝謝你的幫助。 如果您需要查看代碼,我可以找到一些。

編輯:只是為了一些澄清/上下文:這是針對我正在努力發展自己作為程序員的技能的定時賽車視頻游戲。 這個想法是,玩家有60秒的時間完成一個圈。 如果播放器成功完成一圈,計時器將重置為60秒,並且軌跡會變得更加困難。 游戲一直進行到由於困難而無法在60秒內完成一圈。 游戲將圈數記錄為高分,並詢問玩家是否要重試。

如果我是你,我會使用:

  1. 一個AtomicInteger變量,它將保留當前的倒計時值;
  2. 一個計時器線程,它將每1秒喚醒一次,並decrementAndGet() ,將結果與零進行比較,如果結果為零,則終止應用程序;
  3. (可能是)一個線程,該線程也將每隔1秒喚醒一次以重新繪制GUI-這里最好的方法取決於您的GUI框架。

最后,每當您需要將計數重置為60s時,只需從任何線程調用set(newValue)

計時器線程的run()方法可能很簡單:

for (;;) {
  if (counter.decrementAndGet() <= 0) {
    // TODO: exit the app
  }
  Thread.sleep(1000);
}

我認為正確解決此問題比嘗試管理多個Timer對象要容易得多。

我知道這是一個太老的問題了,但是為了那些可能偶然發現這個問題並面臨相同挑戰的人。

這對我來說很完美

        int time = 1800; //30 minutes
        Thread clock = new Thread(){
            public void run(){
                for(;;){
                    try {
                        Thread.sleep(1000); //Sleeps for 1 second
                        time -= 1; //Reduce time by 1 every second
                        lblCount.setText(String.valueOf(time)); //Label to print the value to
                        if (time == 300) {
                            new Warning().setVisible(true); //Another interface to display when the time remains 5 mins
                        } else if (time == 0) {
                            new Login().setVisible(true); //Display login interface when timer reaches zero
                            dispose(); //Close current interface
                        }
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Counter.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        };
        clock.start();

在應用程序中實現計時器的最佳方法是使用某些Sheduler框架,例如Quartz

您可以使用java.util.Timer調度方法的執行,然后在滿足要求的情況下將其取消。

像這樣:

timer = new Timer();
timer.schedule(new Task(), 60 * 1000);

然后創建一個這樣的類來處理計時器時間表:

class Task extends TimerTask {
    public void run() {
      System.exit(0);
    }
  }

如果滿足要求,請執行此操作以阻止其執行:

timer.cancel();

如果您需要更好地更新GUI以使用SwingWorker http://en.wikipedia.org/wiki/SwingWorker,我將編寫以下內容:

SwingWorker<String, Integer> timer = new SwingWorker<String, Integer>() {
    Integer timer=60;
    @Override
    protected String doInBackground() throws Exception {
      //update guiModel
      //label.setText(timer.toString());
        while(timer>0){
        Thread.sleep(1000);
        timer--;
        }
        return null;
    }
    @Override
     public void done(){
         System.exit(0);
     } 
};

JButton restart = new JButton(){
    {
  addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                timer.cancel(true);
                timer.execute();
            }
        });      
    }
};

暫無
暫無

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

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