web-dev-qa-db-ja.com

タイマーとjavafx

私はjavafxを使用して、所定の不規則な間隔で画面に物事を表示させるコードを書こうとしています。タイマーを使用しようとしました( Java.util ではなく、 javax.swing )。別のアプリケーションで作業している場合、アプリケーションで何も変更できないことがわかります(タイマーのように)タイマーが両方とも別個のスレッドである場合、どのようにしてタイマーをアプリケーションと対話させることができるか誰にも教えてもらえますか?

18
i .

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();
18
Michael Berry

JavaFXアプリケーションスレッドで今後のアクションをスケジュールするためにJava.util.TimerまたはJava.util.concurrent.ScheduledExecutorServiceは必要ありません。 JavaFX Timelineをタイマーとして使用できます。

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

または、 ReactFX の便利なメソッドを使用できます。

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

アクションはPlatform.runLaterでラップする必要がないことに注意してください。アクションはすでにJavaFXアプリケーションスレッドで実行されているためです。

20
Tomas Mikula

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

私はこれを使用し、それは完全に動作します

17
Flo C