2015-05-30 42 views

回答

5

如何使用PauseTransition

一個PauseTransition是一次性的停頓。一秒鐘的停頓後下面的示例將更新標籤的文本:

label.setText("Started"); 
PauseTransition pause = new PauseTransition(Duration.seconds(1)); 
pause.setOnFinished(event -> 
    label.setText("Finished: 1 second elapsed"); 
); 
pause.play(); 

爲什麼PauseTransition是不是你

但是,這是不是你想要做什麼。根據你的問題,你想每秒更新一次標籤,而不是一次。您可以將暫停轉換設置爲無限循環,但這不會對您有所幫助,因爲您無法在JavaFX 8中的循環完成時設置事件處理程序。如果PauseTransition無限期地循環,將永遠不會調用轉換的完成處理程序因爲過渡將永遠不會結束。所以,你需要另一種方式來做到這一點...

您應該使用時間軸

由於suggested by Tomas Mikula,使用Timeline代替PauseTransition。

label.setText("Started"); 
final IntegerProperty i = new SimpleIntegerProperty(0); 
Timeline timeline = new Timeline(
    new KeyFrame(
     Duration.seconds(1), 
     event -> { 
      i.set(i.get() + 1); 
      label.setText("Elapsed time: " + i.get() + " seconds"); 
     } 
    ) 
); 
timeline.setCycleCount(Animation.INDEFINITE); 
timeline.play(); 

與定時器

替代溶液有基於一個Timer對以下問題的替代解決方案:

然而,我更喜歡基於時間軸的解決方案從這個問題的定時器解決方案。定時器需要一個新線程,並且需要特別注意確保JavaFX應用程序線程中發生更新,並且基於時間軸的解決方案不需要任何這些。

+0

謝謝你引入正確的方向內側! – Rin

+0

要完成,如果我是正確的,如果您在完成處理程序內再次啓動PauseTransition,則可以使用PauseTransition。 – Adowrath

+0

@Adowrath,是的,你是對的。有可能的。 – c0der

1

正如評論說Adowarth

,你可以再次使用PauseTransition如果你啓動它 完成處理

int cycle = 0; 
label.setText("Started"); 
PauseTransition pause = new PauseTransition(Duration.seconds(1)); 
pause.setOnFinished(event -> 
    label.setText("Finished cycle " + cycle++); 
    pause.play(); 
); 
pause.play(); 
相關問題