2015-04-17 67 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