我目前正在开发一个项目,该项目有一个简单的倒计时,用户输入一个时间,然后从那个时间开始倒计时。它是基于GUI的,并向用户显示倒计时。香港专业教育学院设法让它倒计时,但它没有正确显示。
例如,如果我输入1分30秒,则从1:30倒计时到1:01然后错误地显示0:00然后从0:59倒计时。它是正确的,直到我到达分钟变为秒并且它没有正确显示1秒的点。
倒计时课程:
class countdownClass implements ActionListener { //counts down then beeps
int counter;
public countdownClass(int counter) {
this.counter = counter;
}
public void actionPerformed(ActionEvent sc) { //counts down every second
counter--;
if(counter >= 1) { //a simple countdown
if(counter > 9){ //this statement is for aestetic purpose as before
seconds.setText("" + counter);
}else{
seconds.setText("0" + counter);
}
}
else if(minutesNum >= 1 && counter <= 0){ //if minute exists carry on the countdown
// 1:01 - > 1:00 - > 0:59
int minuteUpdate = minutesNum - 1;
if (minutesNum < 9){
minutes.setText("0" + Integer.toString(minutesNum));
seconds.setText("00");
if(counter <= 0){
minutes.setText("0" + Integer.toString(minuteUpdate));
}
}else{
minutes.setText("0" + Integer.toString(minutesNum));
seconds.setText("0" + Integer.toString(00));
minutes.setText("0" + Integer.toString(minuteUpdate));
}
counter = 60;
}
else if(minutesNum == 0 && counter == 0) { //once the countdown ends plays a beep
timer.stop();
seconds.setText("00");
finish.setText("Time is up!");
start.setEnabled(true);
try{
clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(new File("ring.wav")));
clip.start();
soundPlay = true;
}
catch (Exception e){
e.printStackTrace(System.out);
}
}
}
}
你可以帮我确定代码出错的地方并为我提供修复程序。
感谢您的时间。
答案 0 :(得分:2)
您的代码看起来有点过度设计。只需将用户输入的时间转换为秒,然后每秒递减一次该值。然后用以下内容打印结果:
private static String secondsToMinutesAndSeconds(int time) {
int minutes = time / 60;
int seconds = time % 60;
return String.format("%02d:%02d", minutes, seconds);
}
E.g。 1分30秒仅需90秒。将90
传递给上述方法即可获得01:30
。如果您需要单独的分钟和秒值,那么编辑该代码示例应该很容易。
答案 1 :(得分:0)
显示的分钟数字显示为minuteUdpate,设置为小于MinutesNum。
else if(minutesNum >= 1 && counter <= 0){ //if minute exists carry on the countdown
// 1:01 - > 1:00 - > 0:59
int minuteUpdate = minutesNum - 1;
if (minutesNum < 9){
minutes.setText("0" + Integer.toString(minutesNum));
seconds.setText("00");
if(counter <= 0){
minutes.setText("0" + Integer.toString(minuteUpdate));
}
}else{
minutes.setText("0" + Integer.toString(minutesNum));
seconds.setText("0" + Integer.toString(00));
minutes.setText("0" + Integer.toString(minuteUpdate));
}
counter = 60;
minutesNum小于9,counter = 0表示1:00,所以这一行应该完成:
minutes.setText("0" + Integer.toString(minuteUpdate));
我会删除if if block。在将秒数更改为60之前,不应减少分钟数。
答案 2 :(得分:0)
对我来说,你的代码是无用的。
你应该做什么:
minutes
和seconds
。这只是一个展示我的想法的概念:
private static int minutes = 0;
private static int seconds = 5;
private static Timer timer;
private static TimerTask task = new TimerTask()
{
@Override
public void run()
{
if (countdown())
System.out.println(minutes + ":" + seconds);
else
{
System.out.println("Finish!");
timer.cancel();
}
}
};
private static boolean countdown()
{
seconds --;
if (seconds < 0)
{
minutes--;
seconds = 59;
if (minutes == -1)
{
return false;
}
}
return true;
}
public static void main(String[] args)
{
timer = new Timer();
timer.schedule(task, 0, 1000);
}
您只能使用秒数并避免使用minutes
变量。
(示例:1分钟=&gt; 60秒;然后使用方法使用分区修复它)
这是我第一次使用ScheduledThreadPoolExecutor
因此无法完美。
private static int minutes = 0;
private static int seconds = 5;
private static ScheduledThreadPoolExecutor executorService;
private static boolean countdown()
{
seconds --;
if (seconds < 0)
{
minutes--;
seconds = 59;
if (minutes == -1)
{
return false;
}
}
return true;
}
private static Runnable task = new Runnable()
{
@Override
public void run()
{
if (countdown())
System.out.println(minutes + ":" + seconds);
else
{
System.out.println("Finish!");
// by throwing an exception we will stop the countdown
throw new RuntimeException();
}
}
};
public static void main(String[] args)
{
executorService = new ScheduledThreadPoolExecutor(1);
executorService.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);
try
{
// schedulate again the countdown
System.out.println("Wait 7 seconds");
Thread.sleep(7000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("Schedulate again");
// since we work with the original values
// we must reset it
minutes = 0;
seconds = 5;
executorService.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);
}
请记住:如果多线程调用countdown
方法,则此代码不起作用!
无论如何,您可以使用executorService.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);
来恢复倒计时。