计时器和JavaFX

19

我正在尝试编写一段代码,使用javafx在预定但不规则的时间间隔内将内容显示在屏幕上。我尝试使用计时器(java.util,而非javax.swing),但是如果你从单独线程工作的话就不能更改应用程序中的任何东西(像计时器)。请问有人可以告诉我如何让计时器在它们都是单独线程的情况下与应用程序交互吗?


1
参见 如何在JavaFX中每2秒更新标签; 即使用 Platform.runLater 从单独的线程更新UI,或者使用JavaFX动画框架保持所有内容都在UI线程上。 - jewelsea
3个回答

22

你不需要 java.util.Timer 或者 java.util.concurrent.ScheduledExecutorService 来安排 JavaFX 应用线程上的未来操作。你可以使用 JavaFX 时间轴作为定时器:

new Timeline(new KeyFrame(
        Duration.millis(2500),
        ae -> doSomething()))
    .play();

或者,你可以使用来自ReactFX的便捷方法:

FxTimer.runLater(
        Duration.ofMillis(2500),
        () -> doSomething());

请注意,您不需要将操作包装在Platform.runLater中,因为它已在JavaFX应用程序线程上执行。

如果使用ReactFX,如何暂停和恢复ReactFX的Timer和FxTimer?我正在使用它来定期保存一些东西。在ReactFX中是否有类似Timeline的pause()和play()的等效函数? - mk7

19

berry120的回答同样适用于java.util.Timer,所以你可以这样做:

Timer timer = new java.util.Timer();

timer.schedule(new TimerTask() {
    public void run() {
         Platform.runLater(new Runnable() {
            public void run() {
                label.update();
                javafxcomponent.doSomething();
            }
        });
    }
}, delay, period);

我用过这个,它完美地工作了。


18

如果您要操作任何JavaFX组件,必须从平台线程(即JavaFX的事件分派线程)中进行操作。您可以通过调用Platform.runLater()轻松地完成此操作。因此,例如,这样做是完全安全的:

new Thread() {
    public void run() {
        //Do some stuff in another thread
        Platform.runLater(new Runnable() {
            public void run() {
                label.update();
                javafxcomponent.doSomething();
            }
        });
    }
}.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接