2016-12-06 1 views
-2

이 작은 응용 프로그램을 개발하고있었습니다. JFrame에는 3 명의 JSpinners가 시간, 분 및 초를 선택할 수 있습니다. 또한 시간을 시작하기위한 JButton이 있습니다. 나는 그것을 누를 때 JSpinners를 사용하여 선택한 시간을 계산해야합니다. 카운트 다운 시간을 표시하는 JLabel이 있습니다. StackOverFlow에서 많은 게시물을 검색했지만 도움이되지 않았습니다. 이것은 게시물에서 찾은 코드이며 전혀 작동하지 않습니다. 아무도 도와 줄 수 있니 ???카운트 다운 타이머를 만드는 방법 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

은 현명한 많은 실수 구현이 있습니다.

기능에 예외를 throw 할 필요가 없습니다

throws InterruptedException 

코드를 제공해야 새로운 Thread가에서 실행 말했다 될 작성하려면 스레드 (일명 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

감사합니다. 너 너무 대단해. @UDKOX 내가 알려주겠다. 코드에 문제가있다. –

+0

시간 (초, 분, 초)을 초로했다. Seconds를 System.out.println (i)으로 인쇄하면; 샘플에서는 초부터 초까지만 초를 인쇄합니다. 내가 첨부 한 그림 에서처럼 필요한 것은 Start를 누르면 스톱워치처럼 분과 시간이 0이 될 때까지 초가 0으로 줄어야합니다. 어떤 아이디어 어떻게 할 수 있습니까? –

+0

@ CodeBae 코드를 수정하고 설명을 추가했습니다. 원하는 출력을 얻으려면 * for * 루프 만 변경하면됩니다. 스스로 할 수 없다면 먼저 프로그래밍에 관한 책을 읽어야합니다. 대답을 복사/붙여 넣기 만하면됩니다. – UDKOX

0

저는 50 점이 없기 때문에 귀하의 질문에 답변을 드릴 수 없으므로 여기에 질문으로 답변을 작성해야합니다.

위 코드가 작동하지 않는다고합니다. 정확히 작동하지 않는 것은 무엇입니까? 증상은 무엇이며 어떤 일이 발생할 것으로 예상합니까?

문제 중 하나는 분 및 시간을 완전히 무시하고 초만 반복하는 것입니다. 다른 하나는 전혀 사용되지 않는 스레드를 작성한다는 것입니다. 세 번째는 for 루프 안에 Thread.sleep(1000)을 호출하는 것이지만, 끝날 때까지 스레드를 완전히 차단한다는 것을 알고 있는지 확실하지 않습니다.

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

이 두 번째로, Thread thread = new Thread();이 전혀 사용되지 않습니다

첫째, for 루프로 시작해야합니다.

Thirdy, 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); 
     } 
    } 
} 

.

다른 솔루션은 카운트 다운 타이머가 0에 도달하면 호출 될 것이다, 콜백 함수로 새 스레드를 생성하는 것입니다 :

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

왜 스레드를 사용하지 않고 스윙 타이머를 사용할 수 없습니까? –

관련 문제