我正在尝试编写一个代码,使用javafx以预定但不规则的间隔在屏幕上显示内容。我尝试使用计时器(java.util,而不是javax.swing)但事实证明,如果你是从一个单独的线程工作,你就无法改变应用程序中的任何东西。(就像一个计时器)可以有人告诉我如何让Timer与应用程序进行交互,如果它们都是单独的线程吗?
答案 0 :(得分:19)
您不需要java.util.Timer
或java.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);
我用过它并且效果很好