【问题标题】:JavaFX repeat loop when transition ends转换结束时JavaFX重复循环
【发布时间】:2015-04-17 13:27:18
【问题描述】:

我正在尝试执行以下循环:

  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 相同。我宁愿不编写等待,但即使我这样做了,我也不确定如何让循环在重复之前等待,同时又不停止播放过渡。

我能做些什么呢?

【问题讨论】:

  • 我认为您的第一个版本不会创建无限递归。 transition 必然封装了一些线程,所以play 方法基本上是在某个线程中调度转换,然后立即退出。由于它退出,您不会在堆栈上保留方法调用。 (不过,@eckig 的解决方案是首选)。
  • 这意味着没有堆栈溢出,对吧?我让它运行了很长一段时间,想知道为什么它没有坏,我只是假设它是轻量级的。另外,如果这不会导致错误,为什么首选@eckig 的解决方案? (不怀疑,只是想知道为什么)
  • 是的,这意味着没有 stackoverflow。我更喜欢@eckig 的解决方案,因为它更清楚发生了什么。由于documentation 明确指出play() 是一个异步调用,但我认为您的原始代码很好。

标签: java loops javafx transition wait


【解决方案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();

【讨论】:

  • 感谢您的回答!我会在它开始工作后立即将其标记为已接受(这可能需要一段时间,因为我以前没有使用过时间线)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
相关资源
最近更新 更多