Java倒计时器不显示正确的时间

时间:2014-04-02 15:17:18

标签: java

我目前正在开发一个项目,该项目有一个简单的倒计时,用户输入一个时间,然后从那个时间开始倒计时。它是基于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);
                    }
                }
            }
    }
你可以帮我确定代码出错的地方并为我提供修复程序。

感谢您的时间。

3 个答案:

答案 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)

对我来说,你的代码是无用的。

你应该做什么:

  1. 使用两个变量来保存minutesseconds
  2. 这两个变量的起始值将是用户放置的内容(例如3:50,分钟为3,秒为50)
  3. 每秒启动一个计时器,从计数器开始缩放1秒,如果秒数<= 0,则缩放分钟并将秒数设为59.如果分钟数为0且为秒。
  4. 这只是一个展示我的想法的概念:

    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);来恢复倒计时。