i .*_*i . 18 multithreading javafx timer javafx-2
我正在尝试编写一个代码,使用javafx以预定但不规则的间隔在屏幕上显示内容.我试图使用一个计时器(java.util,而不是javax.swing),但事实证明,如果你是从一个单独的线程工作,你不能改变应用程序中的任何东西.(像一个计时器)任何人都可以告诉我我怎么能如果它们都是单独的线程,那么让Timer与应用程序进行交互?
Tom*_*ula 20
您不需要java.util.Timer
或未java.util.concurrent.ScheduledExecutorService
在JavaFX应用程序线程上安排将来的操作.您可以将JavaFX时间轴用作计时器:
new Timeline(new KeyFrame(
Duration.millis(2500),
ae -> doSomething()))
.play();
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用ReactFX中的便捷方法:
FxTimer.runLater(
Duration.ofMillis(2500),
() -> doSomething());
Run Code Online (Sandbox Code Playgroud)
请注意,您无需将操作包装Platform.runLater
,因为它已在JavaFX应用程序线程上执行.
Mic*_*rry 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();
Run Code Online (Sandbox Code Playgroud)
Flo*_*o C 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);
Run Code Online (Sandbox Code Playgroud)
我用过这个,效果很好