2011-09-19 110 views
1

我正在尝试将倒数计时器实现为预先存在的公共类,并且我有几个问题。Java中的循环倒数计时器

概述:一旦程序初始化,我希望在程序中有一个从60(秒)开始倒计时的计时器。

如果计时器到零,程序退出。

如果用户在60秒的时间范围内遇到某些参数,则定时器重置为60,呈现一组新的参数,并再次开始倒计时。它应该能够无限次地执行此操作,直到用户在60秒内未能满足参数。

还会有某种(TBD)计时器的GUI表示,最有可能是数字倒计时或JProgressBar。

我是半新的(〜3个月)编程,自学成才,并且还在学习手(所以要温柔):)

我的问题是:

  1. 是什么实现这个最好的方法是什么?

  2. 我假设这需要在一个线程中运行?

  3. 定时器是否易于配置? (不重要,只是有趣)

感谢您的帮助。如果你需要看代码,我可以找到一些。

编辑:只是为了一些澄清/上下文: 这是一个定时赛车视频游戏,我正在努力发展我的技能,作为一名程序员。这个想法是一个球员有60秒完成一圈。如果玩家完成一圈成功,定时器重置为60秒,轨道变得稍微困难​​一些。游戏一直运行到玩家由于困难而无法在60秒内完成一圈。游戏将圈数记录为高分,并询问玩家是否想再试一次。

+0

也许不是完全退出程序,你应该清楚的框架,并显示一条消息,说明(像)“对不起,时间到了!”?只是神秘地退出(即使有计时器)的程序可能会被认为是越野车。然后在菜单上提供一个“重置”框。 –

+0

对不起,我没有在说明中详细说明,但我打算让程序退出并显示一个JOptionPane,上面写着“抱歉,计时器用完了!点击好,再试一次”。 – Speakr

+0

然后你的程序并不是真的退出,只是'JFrame'被篡改或隐藏(和一个新的显示)。 'System.exit()'在这种情况下不起作用。让主线程管理窗口,当定时器用完时调用'dispose()'(并可能重新初始化显示元素),并显示通知窗口。 –

回答

1

如果我是你,我会使用:

  1. AtomicInteger变量,将保持当前倒计时值;
  2. 一个计时器线程,它会每1s醒来一次,decrementAndGet()变量,比较结果为零,如果结果为零,则终止应用程序;
  3. (可能)一个线程也会唤醒每1秒来重新绘制GUI - 这里最好的方法取决于您的GUI框架。

最后,无论何时您需要将计数重置为60秒,您都可以从任何线程调用set(newValue)

计时器线程的run()方法可能是简单的:

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

我认为这是很容易得到比试图管理多个Timer对象的这一权利。

+0

这让我朝着正确的方向前进。在我真正理解之前,我将不得不搅乱它,但这是一个很好的开始平台。 – Speakr

0

到impliment在应用程序定时器,最好的办法是使用一些sheduler框架,如Quartz

0

你可以使用java.util.Timer调度的方法的执行,然后取消它,如果要求得到满足。

像这样:

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

然后做出这样的类来处理timerschedule:

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

如果需求得到满足,那么这样做是为了停止执行它:

+0

'System.exit(0);'杀死整个虚拟机。这是唯一的出路吗,还是有办法注册一个会告诉主框架自杀的事件? –

0

如果您需要更新您的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(); 
      } 
     });  
    } 
};