我正在尝试编写一段代码,使用javafx在预定但不规则的时间间隔内将内容显示在屏幕上。我尝试使用计时器(java.util,而非javax.swing),但是如果你从单独线程工作的话就不能更改应用程序中的任何东西(像计时器)。请问有人可以告诉我如何让计时器在它们都是单独线程的情况下与应用程序交互吗?
我正在尝试编写一段代码,使用javafx在预定但不规则的时间间隔内将内容显示在屏幕上。我尝试使用计时器(java.util,而非javax.swing),但是如果你从单独线程工作的话就不能更改应用程序中的任何东西(像计时器)。请问有人可以告诉我如何让计时器在它们都是单独线程的情况下与应用程序交互吗?
你不需要 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应用程序线程上执行。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);
我用过这个,它完美地工作了。
如果您要操作任何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();