计时器和javafx

i .*_*i . 18 multithreading javafx timer javafx-2

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

Tom*_*ula 20

您不需要java.util.Timer或未java.util.concurrent.ScheduledExecutorService在JavaFX应用程序线程上安排将来的操作.您可以将JavaFX时间轴用作计时器:

new Timeline(new KeyFrame(
        Duration.millis(2500),
        ae -> doSomething()))
    .play();
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用ReactFX中的便捷方法:

FxTimer.runLater(
        Duration.ofMillis(2500),
        () -> doSomething());
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*rry 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();
Run Code Online (Sandbox Code Playgroud)


Flo*_*o C 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);
Run Code Online (Sandbox Code Playgroud)

我用过这个,效果很好