2016-12-06 5 views
-2

Я разрабатывал это небольшое приложение. В JFrame у меня есть 3 JSpinners для выбора часов, минут и секунд. Кроме того, JButton запускает время. Когда я нажимаю его, он должен подсчитывать время, которое я выбрал, используя JSpinners. Существует JLabel, чтобы показать время CountDown. Я искал много сообщений в StackOverFlow, но ничего не помог мне. Это код, который я нашел в сообщении, и он не работает вообще. Может кто-нибудь помочь?Как сделать CountDown Timer Java

private void countDownTimer() throws InterruptedException { 
    Thread thread = new Thread(); 
    int hours = (int) jSpinner1.getValue(); 
    int minutes = (int) jSpinner2.getValue(); 
    int seconds = (int) jSpinner3.getValue(); 

    for (int a = seconds; a <= 0; a--) { 

      Thread.sleep(1000); 
      System.out.println(a); 
     } 
    } 

} 

enter image description here

+0

Кто-нибудь может мне помочь, пожалуйста??? –

+0

Может быть, вы можете использовать https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTask,%20long,%20long) –

ответ

0

Есть много ошибок, реализация мудр.

Там нет необходимости бросать исключение на функцию

throws InterruptedException 

Чтобы создать новый Thread вы должны предоставить код, который будет работать в указанной нити (AKA Runnable):

Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run(){ 
      // Your code here 
     } 
    }); 
thread.start(); 

Кроме того, я не могу понять цель следующего кода:

Что вы пытаетесь достичь, считая секунды? Как насчет часов и минут?

Я представлю решение, которое вам нужно будет выполнить для того, чтобы код работал так, как вы хотите, так как он будет отсчитывать всю сумму секунд. Если вы хотите обновить часовое и минутное значения, вам придется самому поработать над этим.

private void countDownTimer() { 

    final int hours = (int) jSpinner1.getValue(); 
    final int minutes = (int) jSpinner2.getValue(); 
    final int seconds = (int) jSpinner3.getValue(); 

    // Create Thread not to block UI 
    Thread thread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // Calculate total seconds to count down 
      int countdownSeconds = hours * 3600 + minutes * 60 + seconds; 

      // Count down to 0 and print it on the console 
      for (int i = countdownSeconds ; i >= 0; i--) { 

       try{ 
        Thread.sleep(1000); 
       }catch (InterruptedException e) {} 

       System.out.println(i); 
      } 
     } 
    }); 
    // Start the Thread 
    thread.start(); 
} 

Упование вы считаете полезным. Не стесняйтесь задавать вопросы по комментариям.

+0

Thank вы так много @UDKOX Я сообщу вам, если у меня возникли проблемы с вашим кодом –

+0

Здесь вы сделали время (часы, минуты и секунды) до секунд. Если он печатает секунды как System.out.println (i); в образце он будет печатать только секунды от вершины до нуля. Как и на картинке, которую я приложил, мне нужно всего лишь Когда я нажимаю «Старт», секунды должны уменьшаться до нуля, пока минуты и часы не станут нулями, как в секундомере. Любая идея Как я могу это сделать? –

+0

@CodeBae Я исправил ваш код и добавил объяснения для вас. Вам нужно только изменить цикл * for *, чтобы получить желаемый результат. Если вы не можете сделать это самостоятельно, возможно, вам следует сначала прочитать некоторые книги по программированию. Для меня бесполезно это делать, если вы просто собираетесь копировать/вставлять ответ. – UDKOX

0

Я не могу комментировать ваш вопрос, потому что у меня нет 50 баллов, поэтому мне придется написать ответ с вопросом здесь.

Вы говорите, что приведенный выше код не работает. Что именно не работает? Каковы симптомы и что вы ожидаете?

Одна из проблем заключается в том, что вы выполняете итерацию только за считанные секунды, полностью игнорируя минуты и часы. Другой заключается в том, что вы создаете поток, который не используется вообще. Третий заключается в том, что вы вызываете Thread.sleep(1000) внутри цикла for, но я не уверен, знаете ли вы, что он полностью заблокирует Thread, пока он не будет завершен.

Во-первых, цикл должен начинаться с:

for (int a = hours * 3600 + 60 * minutes + seconds; a >= 0; a--) 

Во-вторых, Thread thread = new Thread(); не используется вообще.

В-третьих, Thread.sleep(1000) будет блокировать текущую нить до ее завершения.

И, наконец, ваше состояние говорит a <= 0 вместо a >= 0.

Так один из способов, вы можете скорректировать приведенный выше код:

private void countDownTimer() throws InterruptedException { 
    int hours = (int) jSpinner1.getValue(); 
    int minutes = (int) jSpinner2.getValue(); 
    int seconds = (int) jSpinner3.getValue(); 

    for (int a = hours * 3600 + 60 * minutes + seconds; a >= 0; a--) { 
      Thread.sleep(1000); 
      System.out.println(a); 
     } 
    } 
} 

Это предполагает, что «не работает» означает, что он игнорирует минуты и часы.

Другим решением является создание нового потока с помощью функции обратного вызова, которая будет вызываться после того, как таймер обратного отсчета дойдет до нуля:

public class CountDownRunnable implements Runnable { 
    private final int hours; 
    private final int minutes; 
    private final int seconds; 

    public CountDownRunnable(int hours, int minutes, int seconds) { 
     this.hours = hours; 
     this.minutes = minutes; 
     this.seconds = seconds; 
    } 

    public void run() { 
     for (int a = hours * 3600 + 60 * minutes + seconds; a >= 0; a--) { 
      Thread.sleep(1000); 
      System.out.println(a); 
     } 

     // Here goes your code that will be invoked once the timer reaches zero... 
    } 
} 

Тогда ваш метод будет выглядеть следующим образом:

private void countDownTimer() throws InterruptedException { 
    (new Thread(new HelloRunnable())).start(); 
} 
+0

Почему нельзя использовать Swing Timer без использования Threads ??? –

 Смежные вопросы

  • Нет связанных вопросов^_^