2013-05-28 35 views
1

嘿,我只需要一个问题的答案... 我将如何使下面的代码不冻结我的整个JFrame?如何使一个线程不冻结你整个JFrame。 JAVA

   try { 
       Thread.sleep(Integer.parseInt(delayField.getText()) * 1000); 
       System.out.println("Hello!"); 
      } catch(InterruptedException ex) { 
       Thread.currentThread().interrupt(); 
      } 

回答

7

使用不同的线程来执行这个任务。如果你这样做的主UI线程,然后将冻结。例如,你可以按照

new Thread() { 

     @Override 
     public void run() { 
      try { 
       Thread.sleep(Integer.parseInt(delayField.getText()) * 1000); 
       System.out.println("Hello!"); 
      } catch (InterruptedException ex) { 
       Thread.currentThread().interrupt(); 
      } 

     } 
    }.start(); 

UPDATE

后我有更好的更新的答案罗宾和马尔科的明智建议做解。

ActionListener taskPerformer = new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
       System.out.println("Hello!"); 

     } 
    }; 
    javax.swing.Timer t = new javax.swing.Timer(Integer.parseInt(delayField.getText()) * 1000, taskPerformer); 
    t.setRepeats(false); 
    t.start(); 
+0

谢谢你的工作:D – user2413200

+2

因为'JTextField#getText'不是线程安全的,你不应该从另一个线程调用那个方法,那么EDT – Robin

+0

@Robin,yup没有想到,而后postin :(...一个同步的方法可以用来获取文本..会有任何副作用吗? – stinepike

1

你不想在UI执行这个(或事件调度线程)线程。而是在一个单独的线程中。否则(如你所见)你会阻止用户界面。

这是一个很好的做法,在一个单独的线程中执行耗时的操作,并利用SwingUtilities.invokeLater()如果这些线程需要执行(在UI例如,在上面显示“你好”)的一些后续UI动作

3

无论你什么时候在你的GUI代码中使用Thread.sleep,阻止自己想想摇摆定时器,这是这个职位的合适的工具。安排您需要延迟执行的任务。

对此使用另一个线程并不是最好的建议:它浪费了一个沉重的系统资源(一个线程)来完成任何事情,只能等待。