首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的循环倒计时器

Java中的循环倒计时器
EN

Stack Overflow用户
提问于 2011-09-19 15:28:39
回答 3查看 9K关注 0票数 2

我正试图在一个已经存在的公共类中实现一个倒计时器,我有几个问题。

概述:我希望在程序中有一个计时器,当程序初始化后,计时器从60秒开始计数。

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

如果用户在60秒时间帧内遇到某些参数,则定时器重置为60,呈现一组新的参数,并再次开始倒计时。它应该能够做到无限次,直到用户在60秒内无法满足参数。

计时器也会有某种形式的图形用户界面表示,很可能是数字倒计时或JProgressBar。

我是半新手(~3个月)编程,自学,仍然学习很多(所以要温和) :)

我的问题是:

  1. ,实现这个的最好方法是什么?
  2. ,我假设它需要在线程中运行?
  3. ,可以很容易地配置定时器吗?(不重要,只是有趣)

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-19 15:34:17

如果我是你,我会用:

zero;

  • (possibly)是一个保持当前倒计时值的AtomicInteger变量;

  • 是一个计时器线程,它每1s唤醒一次,而decrementAndGet()则每1s唤醒一个变量,将结果与零进行比较,如果结果是AtomicInteger,则终止应用程序--这个线程也会每1s唤醒一次以重新绘制GUI --这里最好的方法取决于您的GUI框架。

最后,每当您需要将计数重新设置为60时,只需从任何线程调用set(newValue)

计时器线程的run()方法可以很简单,如:

代码语言:javascript
复制
for (;;) {
  if (counter.decrementAndGet() <= 0) {
    // TODO: exit the app
  }
  Thread.sleep(1000);
}

我认为这比尝试管理多个Timer对象容易得多。

票数 1
EN

Stack Overflow用户

发布于 2011-09-19 15:37:49

您可以使用java.util.Timer来安排方法的执行,然后在满足要求时取消它。

如下所示:

代码语言:javascript
复制
timer = new Timer();
timer.schedule(new Task(), 60 * 1000);

然后像这样创建一个类来处理时间表:

代码语言:javascript
复制
class Task extends TimerTask {
    public void run() {
      System.exit(0);
    }
  }

如果满足了要求,则执行此操作以阻止其执行:

代码语言:javascript
复制
timer.cancel();
票数 0
EN

Stack Overflow用户

发布于 2011-09-19 15:54:09

如果您需要更新GUI以更好地使用SwingWorker http://en.wikipedia.org/wiki/SwingWorker,我将编写如下所示:

代码语言:javascript
复制
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();
            }
        });      
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7473348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档