2016-01-25 163 views
2
Button button = new Button("Show Text"); 
button.setOnAction(new EventHandler<ActionEvent>(){ 
    @Override 
    public void handle(ActionEvent event) { 
     Platform.runLater(new Runnable(){ 
      @Override 
      public void run() { 
       field.setText("START"); 
      } 
     }); 

     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     Platform.runLater(new Runnable(){ 
      @Override 
      public void run() { 
       field.setText("END"); 
      } 
     }); 
     } 
}); 

運行上面的代碼後,field.setText("START")不執行,我的意思是文本框沒有其文本設置爲「START」,爲什麼?如何解決這個問題?Platform.runLater問題 - 延遲執行

+0

相關鏈接:[JavaFX的8:如何將添加純滯後的聽衆(http://stackoverflow.com/questions

您可以在一個新的線程運行上面的所有代碼解決這個問題/ 34784037/javafx-8-how-to-add-a-timedelay-to-a-listener)和[等待改變屬性後改變JavaFX 8](http://stackoverflow.com/questions/22263008/wait- before-react-to-a-property-change-javafx-8) – jewelsea

回答

5

請記住,在JavaFX線程上調用該按鈕的onAction,因此您有效地將UI線程暫停5秒。當UI線程在這五秒結束時未凍結時,兩個更改都會相繼應用,所以最終只能看到第二個。

Button button = new Button(); 
    button.setOnAction(event -> { 
     Thread t = new Thread(() -> { 
      Platform.runLater(() -> field.setText("START")); 
      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      Platform.runLater(() -> field.setText("END")); 
     }); 

     t.start(); 
    }); 
+0

謝謝....它的工作! – Walker

+3

很好的解釋了爲什麼 - 雖然注意到fx帶有廣泛的高級動畫支持:-) @Walker – kleopatra

+2

第一個'runLater'是不必要的。由於事件處理程序在應用程序線程上運行,'field.setText(「START」)'可以安全地移動到'Runnable'的「外部」。 – fabian