2014-09-01 104 views
0

我有一個java swing gui程序,當我點擊一個切換按鈕時,一個計時器開始,但我想能夠點擊相同的按鈕,計時器停止,現在它不會讓我再次點擊它。 這是我的定時器類爲什麼我的按鈕不可點擊? (爪哇)

public void runningClock(){ 
     isPaused = false; 
     while(!isPaused){ 
     incrementTime(); 
     System.out.println("Timer Current Time " + getTime()); 
     time.setText(""+ getTime()); 
     try{Thread.sleep(1000);} catch(Exception e){} 
     } 
    } 


public void pausedClock(){ 
     isPaused=true; 
     System.out.println("Timer Current Time " + getTime()); 
     time.setText(""+ getTime()); 
     try{Thread.sleep(1000);} catch(Exception e){} 
    } 

,這是我的主類

private void btnRunActionPerformed(java.awt.event.ActionEvent evt) {          

    if(btnRun.getText().equals("Run")){ 
      System.out.println("Run Button Clicked"); 
      btnRun.setText("Pause"); 
      test.runningClock(); 
    } 
    else if(btnRun.getText().equals("Pause")){ 
     System.out.println("Pause Button Clicked"); 
     btnRun.setText("Run"); 
     test.pausedClock(); 

    } 
}     
+0

就拿問題的原因一看[併發在Swing(http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)和[如何使用Swing定時器( http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)爲了解決這個問題(如前所述) – MadProgrammer 2014-09-01 23:36:20

回答

5

你凍結Swing事件線程與Thread.sleep(...)while (something)循環。解決方案:不要這麼做 - 不要在佔用事件線程的事件線程上調用代碼,並阻止它執行必要的任務。改爲改變程序的狀態。併爲你的時鐘,使用Swing Timer。例如,請看我的答案和代碼here

0

你正在你的程序中做這個,​​。由於此聲明應用於主線程本身,所以應用程序本身掛起或者可以說凍結。你可以做的是爲計時器應用一個單獨的線程。

new Thread(new Runnable(){ 
     public void run(){ 
       //Do Stuff 
     } 
}).start();