我试图执行下面的循环JavaFX的重复循环:当过渡结束
- 更新一些变量
- 玩基于过渡/代表变量
- 一旦过渡完成后,去到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相同。我宁愿不用等待编程,但即使我做了,我也不确定如何在重复之前等待循环,而不会停止播放的转换。
我能做些什么呢?
我不认为你的第一个版本创建无限递归。 'transition'必须封装一些线程,所以'play'方法基本上在某个线程中调度线程的转换,然后立即退出。由于它退出,因此您不保留堆栈上的方法调用。 (但@ eckig的解决方案是首选)。 –
这将意味着没有堆栈溢出权?我离开它运行了一段时间,并想知道为什么它没有中断,我只是认为它是轻量级的或什么的。另外,如果这不会导致错误,那么为什么@ eckig解决方案是首选? (不要怀疑它,只是想知道为什么) – Spekular
是的,这将意味着没有stackoverflow。我更喜欢@ eckig的解决方案,因为它更清楚发生了什么。由于[documentation](http://docs.oracle.com/javase/8/javafx/api/javafx/animation/Animation.html#play--)明确指出'play()'是一个异步调用,所以I尽管如此,你认为你的原始代码是好的。 –