如何在 Java 中重置计时器?
How do I reset a Timer in Java?
所以我正在尝试使用 Eclipse Oxygen.2 在 Java 中编写一款名为 Lights Out Cube 的手持电子游戏,我决定加入一个计时器,以便玩家知道有多少时间他要求完成比赛。当玩家点击一个名为 "Start/Reset" 的按钮(我在点击一次后将其文本更改为 "Reset"),这是我激活计时器的地方,游戏开始。每次点击后,我都会检查玩家是否完成了游戏,如果完成了,我会停止计时器。如果他想再玩一次,我要重新开始计时。请帮帮我:
//here i have a function called checkIfWinning() which does the checking; if there is a winner, the following code is executed to stop the timer
timer.cancel();
timer.purge();
//timer is a publicly declared java.util.Timer
//this is a code snippet for btnStart with "time" recording the time in seconds
time=0;
timer.schedule(new TimerTask()
{
@Override
public void run()
{
time++;
int hours = (int) time / 3600;
int remainder = (int) time - hours * 3600;
int mins = remainder / 60;
remainder = remainder - mins * 60;
int secs = remainder;
timeTaken.setText(String.format("%02d:%02d:%02d",hours,mins,secs));
}
}, 1000,1000);
有什么办法可以做到吗?或者我必须完全删除计时器吗?
您无法在激活 TimerTask 对象时重置,但在您的特定情况下,您可以重置游戏时间计数而无需删除并重新创建计时器。
由于您的计时器每秒触发一次,因此您所要做的就是在用户单击重置按钮时重置您正在使用的 time
变量。
我正在根据绿巨人和您的评论编辑此答案:
绿巨人是对的,你应该用AtomicInteger来计算你的时间。如果保留计时器 运行,有时可能会出现错误,值不会重置。
你可以有一个 AtomicBoolean 标志让 TimerTask 知道玩家是否在玩游戏。
这是一个代码示例:
AtomicInteger time = new AtomicInteger();
//whenever you want to reset it:
time.set(0);
AtomicBoolean isPlaying = new AtomicBoolean();
//when user clicks "start":
isPlaying.set(true);
//when user wins or clicks "reset"
isPlaying.set(false);
//your timer task will look something like this:
public void run() {
if (isPlaying.get()) {
int currentTime = time.incrementAndGet();
int hours = (int) currentTime / 3600;
int remainder = (int) currentTime - hours * 3600;
int mins = remainder / 60;
remainder = remainder - mins * 60;
int secs = remainder;
timeTaken.setText(String.format("%02d:%02d:%02d",hours,mins,secs));
}
}
这可能很清楚。
您无法在 Java 中重置或暂停计时器,但可以通过不 运行 基于 boolean
检查的计时器来实现功能.
正如之前Hulk和Lev.M所说,AtomicInteger
可以在需要线程安全的情况下使用。
run()
中的整个逻辑可以使用 TimeUnit
将秒转换为指定格式来简化,
time+=1000;
System.out.println(String.format("%02d:%02d:%02d", TimeUnit.SECONDS.toHours(time), TimeUnit.SECONDS.toMinutes(time), time%60));
import java.util.Timer;
import java.util.TimerTask;
public class Game
{
private static int time = 0;
private static Timer t = new Timer();
private static Game g;
private static boolean ispaused = false;
public static void main(String[] args)
{
t.schedule(new TimerTask() {
public void run()
{
if(ispaused)
{
return;
}
time++;
System.out.println(String.format("%02d:%02d:%02d", TimeUnit.SECONDS.toHours(time), TimeUnit.SECONDS.toMinutes(time), time%60));
}
}, 1000, 1000);
g = new Game();
try
{
System.out.println("Starting first game");
g.startGame(); Thread.sleep(5000); g.endGame();
System.out.println("Starting second game.");
g.startGame(); Thread.sleep(5000); g.endGame();
}
catch(Exception e)
{}
}
private void startGame()
{
time = 0;
ispaused = false;
System.out.println("Game Started");
}
private void endGame()
{
time = 0;
ispaused = true;
System.out.println("Game ended");
}
};
所以我正在尝试使用 Eclipse Oxygen.2 在 Java 中编写一款名为 Lights Out Cube 的手持电子游戏,我决定加入一个计时器,以便玩家知道有多少时间他要求完成比赛。当玩家点击一个名为 "Start/Reset" 的按钮(我在点击一次后将其文本更改为 "Reset"),这是我激活计时器的地方,游戏开始。每次点击后,我都会检查玩家是否完成了游戏,如果完成了,我会停止计时器。如果他想再玩一次,我要重新开始计时。请帮帮我:
//here i have a function called checkIfWinning() which does the checking; if there is a winner, the following code is executed to stop the timer
timer.cancel();
timer.purge();
//timer is a publicly declared java.util.Timer
//this is a code snippet for btnStart with "time" recording the time in seconds
time=0;
timer.schedule(new TimerTask()
{
@Override
public void run()
{
time++;
int hours = (int) time / 3600;
int remainder = (int) time - hours * 3600;
int mins = remainder / 60;
remainder = remainder - mins * 60;
int secs = remainder;
timeTaken.setText(String.format("%02d:%02d:%02d",hours,mins,secs));
}
}, 1000,1000);
有什么办法可以做到吗?或者我必须完全删除计时器吗?
您无法在激活 TimerTask 对象时重置,但在您的特定情况下,您可以重置游戏时间计数而无需删除并重新创建计时器。
由于您的计时器每秒触发一次,因此您所要做的就是在用户单击重置按钮时重置您正在使用的 time
变量。
我正在根据绿巨人和您的评论编辑此答案:
绿巨人是对的,你应该用AtomicInteger来计算你的时间。如果保留计时器 运行,有时可能会出现错误,值不会重置。
你可以有一个 AtomicBoolean 标志让 TimerTask 知道玩家是否在玩游戏。
这是一个代码示例:
AtomicInteger time = new AtomicInteger();
//whenever you want to reset it:
time.set(0);
AtomicBoolean isPlaying = new AtomicBoolean();
//when user clicks "start":
isPlaying.set(true);
//when user wins or clicks "reset"
isPlaying.set(false);
//your timer task will look something like this:
public void run() {
if (isPlaying.get()) {
int currentTime = time.incrementAndGet();
int hours = (int) currentTime / 3600;
int remainder = (int) currentTime - hours * 3600;
int mins = remainder / 60;
remainder = remainder - mins * 60;
int secs = remainder;
timeTaken.setText(String.format("%02d:%02d:%02d",hours,mins,secs));
}
}
这可能很清楚。
您无法在 Java 中重置或暂停计时器,但可以通过不 运行 基于
boolean
检查的计时器来实现功能.正如之前Hulk和Lev.M所说,
AtomicInteger
可以在需要线程安全的情况下使用。run()
中的整个逻辑可以使用TimeUnit
将秒转换为指定格式来简化,time+=1000; System.out.println(String.format("%02d:%02d:%02d", TimeUnit.SECONDS.toHours(time), TimeUnit.SECONDS.toMinutes(time), time%60));
import java.util.Timer;
import java.util.TimerTask;
public class Game
{
private static int time = 0;
private static Timer t = new Timer();
private static Game g;
private static boolean ispaused = false;
public static void main(String[] args)
{
t.schedule(new TimerTask() {
public void run()
{
if(ispaused)
{
return;
}
time++;
System.out.println(String.format("%02d:%02d:%02d", TimeUnit.SECONDS.toHours(time), TimeUnit.SECONDS.toMinutes(time), time%60));
}
}, 1000, 1000);
g = new Game();
try
{
System.out.println("Starting first game");
g.startGame(); Thread.sleep(5000); g.endGame();
System.out.println("Starting second game.");
g.startGame(); Thread.sleep(5000); g.endGame();
}
catch(Exception e)
{}
}
private void startGame()
{
time = 0;
ispaused = false;
System.out.println("Game Started");
}
private void endGame()
{
time = 0;
ispaused = true;
System.out.println("Game ended");
}
};