我正在尝试将倒数计时器应用到预先存在的公共课程中,我有几个问题。
概述:我希望程序中的计时器在程序初始化后从60(秒)开始倒计时。
如果计时器到达零,则程序退出。
如果用户在60秒的时间范围内满足某些参数,则计时器将重置为60,显示一组新参数,并再次开始倒计时。它应该能够无限次地执行此操作,直到用户在60秒内无法满足参数。
定时器也会有某种(TBD)GUI表示,很可能是数字倒计时或JProgressBar。
我是半新人(约3个月)编程,自学成才,还是学习很多(所以要温柔):)
我的问题是:
实施此方法的最佳方式是什么?
我认为这需要在一个帖子中运行?
计时器是否可以轻松配置? (不重要,只是有趣)
感谢您的帮助。如果你需要查看代码,我可以找到一些。
编辑:只是为了澄清/背景: 这是一个定时赛车视频游戏,我正在努力发展我作为程序员的技能。这个想法是玩家有60秒完成一圈。如果玩家完成一圈成功,则计时器重置为60秒并且轨道变得稍微困难。由于困难,游戏一直持续到玩家无法在60秒内完成一圈。游戏将圈数记录为高分,并向玩家询问他们是否想再试一次。
答案 0 :(得分:1)
如果我是你,我会使用:
AtomicInteger
变量,它将保持当前的倒计时值; decrementAndGet()
变量,将结果与零进行比较并在结果为零时终止应用程序; 最后,每当您需要将计数重置为60秒时,您只需从任何线程中调用set(newValue)
。
计时器线程的run()
方法可以简单如下:
for (;;) {
if (counter.decrementAndGet() <= 0) {
// TODO: exit the app
}
Thread.sleep(1000);
}
我认为比试图管理多个Timer
对象要容易得多。
答案 1 :(得分:0)
在应用程序中实现计时器的最佳方法是使用一些调度程序框架,如Quartz
答案 2 :(得分:0)
您可以使用java.util.Timer
来安排方法的执行,然后在满足要求时取消它。
像这样:
timer = new Timer();
timer.schedule(new Task(), 60 * 1000);
然后创建一个这样的类来处理timerschedule:
class Task extends TimerTask {
public void run() {
System.exit(0);
}
}
如果满足要求,则执行此操作以阻止其执行:
timer.cancel();
答案 3 :(得分: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();
}
});
}
};
答案 4 :(得分:0)
我知道这是一个太老的问题了,但是为了那些可能偶然发现这个问题并面临相同挑战的人。
这对我来说很完美
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();