2014-11-07 4 views
1

자바 코드에 문제가 있습니다. 무한 루프가 발생하는 것 같습니다.자바 스윙 타이머 및 무한 루프 관련 문제가 있습니다.

public void progress(){ 
    x = 3; 

    timer = new Timer(800, new ActionListener() { 
      public void actionPerformed(ActionEvent evt){ 
       System.out.println(x); 
       x--; 

       if(x < 1){ 
        UI(); 
        timer.stop(); 
       } 
      } 
     }); 

    timer.start(); 
} 

메서드 UI는 SavitchIn을 통해 입력을 요청하고 행을 실행하지 않는 것 같습니다. 내가 UI 메서드에서 입력을 요청하기 전에 인쇄하고 인쇄가 제대로 작동합니다. 내 코드에서이 타이머를 제거하고 UI 메서드를 동일하게 유지하면 정상적으로 작동합니다. 인쇄 한 다음 입력을받습니다. 나는 UI 메서드에서 timer.stop()을 추가했으며, 타이머가 중지되었다고 확신하지만 프로그램을 실행 한 후에는 다음 번에 가상 시스템을 다시 설정해야합니다. 그렇지 않으면 실행되지 않습니다. 어떤 도움을 주셔서 감사합니다!

+0

시도의 timer.stop(); UI(); –

+0

'UI()'메소드는 백그라운드 스레드에서 호출되어야합니다. –

답변

2

UI() 메서드는 백그라운드 스레드에서 호출해야 할 가능성이 있습니다 (스윙 이벤트 스레드를 표시하지 않으므로 추측해야 함). 그래서 SwingWorker 나 배경 스레드를 만들고 거기에서이 호출을하십시오. 이에 대한 자세한 내용은 Concurrency in Swing을 참조하십시오. 예컨대

,

public void progress() { 
    x = 3; 

    timer = new Timer(800, new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     System.out.println(x); 
     x--; 

     if (x < 1) { 
      new Thread(new Runnable() { 
       public void run() { 
       UI(); 
       } 
      }).start(); 
      timer.stop(); 
     } 
    } 
    }); 

    timer.start(); 
}