计时器和javafx

时间:2013-05-26 23:17:16

标签: multithreading timer javafx-2 javafx

我正在尝试编写一个代码,使用javafx以预定但不规则的间隔在屏幕上显示内容。我尝试使用计时器(java.util,而不是javax.swing)但事实证明,如果你是从一个单独的线程工作,你就无法改变应用程序中的任何东西。(就像一个计时器)可以有人告诉我如何让Timer与应用程序进行交互,如果它们都是单独的线程吗?

3 个答案:

答案 0 :(得分:19)

您不需要java.util.Timerjava.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应用程序线程上执行。

答案 1 :(得分:18)

如果触摸任何JavaFX组件,则必须从Platform线程(实际上是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();

答案 2 :(得分:17)

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);

我用过它并且效果很好