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