2014-10-27 66 views
1

我在执行后台任务时让JavaFX UI保持活动状态时出现问题。 我已经建立了这个非常简单的代码 -JavaFX UI在执行新线程任务时冻结

@FXML 
ProgressBar prgbProgress; 

@FXML 
private void onClick(ActionEvent event) { 
     Task <Void> t = new Task <Void>() { 

     @Override 
     protected Void call() throws Exception { 
      for (int i = 0; i < 10; i++) { 
      updateProgress(i, 9); 
      Thread.sleep(1000); 
      } 
      return null; 
     } 
     }; 
     prgbProgress.progressProperty().bind(t.progressProperty()); 
     new Thread(t).run(); 
} 

我希望发生是有进度条更新每隔约1秒,直到任务完成。相反,UI完全冻结10秒,之后进度条显示完成。 只是为了说清楚 - 问题不仅在于所有更新最终都会一次出现,而且在此之前UI完全没有响应。

我已阅读了有关此主题的任何其他问题,但无法找到答案。我究竟做错了什么?

谢谢。

+4

'的run()' - >'开始()'。您只需在当前线程中将'Thread'实例作为'Runnable'运行。 – 2014-10-27 15:14:48

+0

是的,正如@MarkoTopolnik所写,你并没有在一个新的'Thread'中执行'Task'。试试'new Thread(t).start();' – icza 2014-10-27 15:16:34

+0

谢谢!现在我觉得很愚蠢。 'run'和'start'之间的区别可以更清楚,但是... – Itai 2014-10-27 15:16:55

回答

3

使用start()方法的代替的run()

@FXML 
ProgressBar prgbProgress; 

@FXML 
private void onClick(ActionEvent event) { 
     Task <Void> t = new Task <Void>() { 

     @Override 
     protected Void call() throws Exception { 
      for (int i = 0; i < 10; i++) { 
      updateProgress(i, 9); 
      Thread.sleep(1000); 
      } 
      return null; 
     } 
     }; 
     prgbProgress.progressProperty().bind(t.progressProperty()); 
     //new Thread(t).run(); // wrong 
     new Thread(t).start(); // right 
} 
+0

有什么区别? – 2016-09-29 16:53:51