2015-04-17 55 views
2

我試圖執行下面的循環JavaFX的重複循環:當過渡結束

  1. 更新一些變量
  2. 玩基於過渡/代表變量
  3. 一旦過渡完成後,去到1

這會重演一次。我使它與以下工作:

//Step 3 
transition.setOnFinished(new EventHandler<ActionEvent>(){ 
    @Override 
    public void handle(ActionEvent event){ 
     doTheThing(); //Step 1, updates data 
     transition.setToValue(data); 
     transition.play(); // Step 2 
    } 
}); 

transition.play(); //Triggers first repeat 

當然,這是一個無盡的遞歸循環,這不是一個好主意。問題是,我無法弄清楚過渡完成後如何觸發重複。我已經使用循環嘗試:

while (1==1){ 
    doTheThing(); 
    transition.setToValue(data); 
    transition.play(); 
} 

但是這不僅不等待過渡(可以預期的,而不是爲我一個問題),它並沒有起到過渡可言,並且程序沒有反應。我也試過這個:

transition.setOnFinished(new EventHandler<ActionEvent>(){ 
    @Override 
    public void handle(ActionEvent event){ 
     ready = true; 
    } 
}); 
while (1==1){ 
    if (ready){ 
     ready = false; 
     doTheThing(); 
     transition.setToValue(); 
     transition.play(); 
    } 
} 

但它的行爲與解決方案#2相同。我寧願不用等待編程,但即使我做了,我也不確定如何在重複之前等待循環,而不會停止播放的轉換。

我能做些什麼呢?

+0

我不認爲你的第一個版本創建無限遞歸。 'transition'必須封裝一些線程,所以'play'方法基本上在某個線程中調度線程的轉換,然後立即退出。由於它退出,因此您不保留堆棧上的方法調用。 (但@ eckig的解決方案是首選)。 –

+0

這將意味着沒有堆棧溢出權?我離開它運行了一段時間,並想知道爲什麼它沒有中斷,我只是認爲它是輕量級的或什麼的。另外,如果這不會導致錯誤,那麼爲什麼@ eckig解決方案是首選? (不要懷疑它,只是想知道爲什麼) – Spekular

+0

是的,這將意味着沒有stackoverflow。我更喜歡@ eckig的解決方案,因爲它更清楚發生了什麼。由於[documentation](http://docs.oracle.com/javase/8/javafx/api/javafx/animation/Animation.html#play--)明確指出'play()'是一個異步調用,所以I儘管如此,你認爲你的原始代碼是好的。 –

回答

1

我建議您使用TimeLine,您可以在其中指定cycleCount,您可以將其設置爲INDEFINITE

例子:

Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), ev -> { 
    // TODO do something meaningful here 
})); 
timeline.setCycleCount(Animation.INDEFINITE); 
timeline.play(); 
+1

感謝您的回答!我會盡快將其標記爲可接受的(這可能需要一段時間,因爲我之前沒有使用時間表)。 – Spekular

+1

@Spekular玩它,'TimeLine'有一個非常強大的API .. – eckig

+1

我會的,再次感謝! – Spekular