19

我正在尝试编写一个代码,使用 javafx 使事物以预定但不规则的间隔出现在屏幕上。我尝试使用计时器(java.util,而不是javax.swing),但事实证明,如果您在单独的线程中工作,则无法更改应用程序中的任何内容。(就像计时器一样)谁能告诉我我怎么能如果它们都是单独的线程,那么让 Timer 与应用程序交互?

4

3 回答 3

22

您不需要也不需要java.util.Timerjava.util.concurrent.ScheduledExecutorServiceJavaFX 应用程序线程上安排未来的操作。您可以使用 JavaFX Timeline 作为计时器:

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

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

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

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

于 2014-06-03T21:48:12.900 回答
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();
于 2013-05-27T11:03:36.400 回答
18

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

我用了这个,它工作得很好

于 2013-09-06T09:51:31.300 回答