首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JavaFX时间轴完成后返回一个值

在JavaFX时间轴完成后返回一个值
EN

Stack Overflow用户
提问于 2018-08-27 18:36:20
回答 4查看 2.4K关注 0票数 5

我正在使用JavaFX中的时间线对Label进行倒计时

代码语言:javascript
复制
timeline.setCycleCount(6);
timeline.play();

我想在时间线结束后返回一个值:

代码语言:javascript
复制
return true;

但是,看起来值是立即返回的,时间线是并行运行的。如何等到时间线完成倒计时,然后在不阻塞时间线的情况下返回值?

编辑:

为了更清楚,我已经尝试过了:

代码语言:javascript
复制
new Thread(() -> {
    timeline.play();
}).start();

while(!finished){ // finished is set to true, when the countdown is <=0

}
return true;

(此解决方案不更新倒计时。)

编辑2:

下面是一个最小的、完整的、可验证的示例:

代码语言:javascript
复制
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;


public class CountdownTest extends Application {

    private Label CountdownLabel;
    private int Ctime;

    @Override
    public void start(Stage primaryStage) {

        CountdownLabel=new Label(Ctime+"");

        StackPane root = new StackPane();
        root.getChildren().add(CountdownLabel);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Countdown Test");
        primaryStage.setScene(scene);
        primaryStage.show();

        Ctime=5;

        if(myCountdown()){
            CountdownLabel.setText("COUNTDOWN FINISHED");
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    public boolean myCountdown(){
         final Timeline timeline = new Timeline(
                            new KeyFrame(
                                    Duration.millis(1000),
                                    event -> {
                                    CountdownLabel.setText(Ctime+"");
                                    Ctime--;

                                    }

                            )
                    );
         timeline.setCycleCount(6);
         timeline.play();
    return true;
    }

}

您可以看到,它首先显示“倒计时完成”,并倒计时到0,而不是从倒计时开始,倒计时到“倒计时完成”。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-27 18:41:22

由于Timeline继承自Animation,因此您可以使用setOnFinished来定义在时间线末尾发生的操作。

代码语言:javascript
复制
timeline.setCycleCount(6);
timeline.play();
timeline.setOnFinished(event -> countdownLabel.setText("COUNTDOWN FINISHED"));
票数 8
EN

Stack Overflow用户

发布于 2018-08-27 18:58:42

如果你真的想等到时间线结束,你可以使用CountDownLatch或者Semaphore以及setOnFinished。下面这样的代码应该是有效的:

代码语言:javascript
复制
CountDownLatch latch = new CountDownLatch(1);
timeline.setCycleCount(6);
timeline.setOnFinished(event -> latch.countDown());
timeline.play();
latch.await();
return true;
票数 2
EN

Stack Overflow用户

发布于 2018-08-27 19:15:01

您正在尝试在一个线程中等待另一个线程中的工作结果。这就是创建synchronisation的目的!例如,java.util.concurrent.Semaphore

代码语言:javascript
复制
public boolean waitForTimeline()  {
    Semaphore semaphore = new Semaphore(0);

    System.out.println("starting timeline");
    Timeline t = new Timeline();
    t.getKeyFrames().add(new KeyFrame(Duration.seconds(2)));
    t.setOnFinished((e)-> {
        System.out.println("releasing semaphore"); 
        semaphore.release();
    });
    t.play();

    System.out.println("waiting for timeline to end");
    try {
        semaphore.acquire();
    } catch (InterruptedException ex) {
        ex.printStackTrace();
        return false;
    }
    return true;
}

但请注意,您不能在"JavaFX应用程序线程“上运行此方法,因为它会阻止UI更新。在单独的线程上运行它:

代码语言:javascript
复制
new Thread(()-> { 
    System.out.println("returned from timeline with " + waitForTimeline()); 
}).start();

或者,更好的做法是使用您在return之后执行的逻辑创建一个侦听器,并从t.setOnFinished()调用该侦听器。对于您的示例,它将是:

代码语言:javascript
复制
public void myCountdown(Runnable onSuccess){
    //...
    timeline.setOnFinished((e)-> {
        onSuccess.run();
    });
}

和相应的调用:

代码语言:javascript
复制
myCountdown(()->{
    CountdownLabel.setText("COUNTDOWN FINISHED");
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52037435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档