JavaFX周期性后台任务

标签 javafx

我尝试定期在 JavaFX 应用程序后台线程中运行,这会修改一些 GUI 属性。

我想我知道如何使用 javafx.concurrent 中的 TaskService 类,并且无法弄清楚如何在不使用 Thread#sleep() 方法的情况下运行此类周期性任务。如果我可以使用 Executors 中的一些 Executor 制作方法 (Executors.newSingleThreadScheduledExecutor())

我尝试每 5 秒运行一次 Runnable,这会重新启动 javafx.concurrent.Service,但它会在调用 service.restart 甚至 service.getState() 时立即挂起。

所以最后我使用了 Executors.newSingleThreadScheduledExecutor(),它每 5 秒触发一次 Runnable,并且 Runnable 使用以下方式运行另一个 Runnable:

Platform.runLater(new Runnable() {
 //here i can modify GUI properties
}

它看起来非常令人讨厌:(有没有更好的方法使用 TaskService 类来做到这一点?

最佳答案

您可以使用时间轴来完成该任务:

Timeline fiveSecondsWonder = new Timeline(
                 new KeyFrame(Duration.seconds(5), 
                 new EventHandler<ActionEvent>() {

    @Override
    public void handle(ActionEvent event) {
        System.out.println("this is called every 5 seconds on UI thread");
    }
}));
fiveSecondsWonder.setCycleCount(Timeline.INDEFINITE);
fiveSecondsWonder.play();

对于后台进程(不会对 UI 执行任何操作),您可以使用旧的好的 java.util.Timer:

new Timer().schedule(
    new TimerTask() {

        @Override
        public void run() {
            System.out.println("ping");
        }
    }, 0, 5000);

关于JavaFX周期性后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49308150/

相关文章:

java - @Value 和 @Autowired 上的 NPE

JavaFX 2 : resizable rectangle containing text

javafx - 如何在 Javafx 中对齐对话框 Pane 的确定按钮?

java - 与结果对话

JavaFX 图表 CSS 属性 "-fx-bar-fill"— 它究竟做了什么?

java - 如何从具有多个属性的可观察列表中获取属性

JavaFX 将组件添加到列表中,动态更改其内容

javafx - 如何从渐变中获取颜色

java - 如何删除或更新 ObservableList 中的某些行

java - 使用不可序列化的对象序列化 hashmap