为什么我的按钮不可点击? (JAVA)

时间:2014-09-01 22:54:53

标签: java swing event-dispatch-thread thread-sleep

我有一个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();

    }
}                   

2 个答案:

答案 0 :(得分:5)

您正在使用Thread.sleep(...)while (something)循环冻结Swing事件线程。解决方案:不要这样做 - 不要在占用事件线程的事件线程上调用代码,并阻止它执行必要的任务。而是更改程序的 状态 。对于您的时钟,请使用Swing Timer。例如,请查看我的答案和代码here

答案 1 :(得分:0)

您正在程序try{Thread.sleep(1000);} catch(Exception e){}中执行此操作。由于此语句应用于主线程本身,因此应用程序本身挂起或者您可以说冻结。你可以做的是为计时器应用一个单独的线程。

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