我正在尝试编写一个代码,使用 javafx 使事物以预定但不规则的间隔出现在屏幕上。我尝试使用计时器(java.util,而不是javax.swing),但事实证明,如果您在单独的线程中工作,则无法更改应用程序中的任何内容。(就像计时器一样)谁能告诉我我怎么能如果它们都是单独的线程,那么让 Timer 与应用程序交互?
问问题
24949 次
3 回答
22
您不需要也不需要java.util.Timer
在java.util.concurrent.ScheduledExecutorService
JavaFX 应用程序线程上安排未来的操作。您可以使用 JavaFX Timeline 作为计时器:
new Timeline(new KeyFrame(
Duration.millis(2500),
ae -> doSomething()))
.play();
或者,您可以使用ReactFX中的便捷方法:
FxTimer.runLater(
Duration.ofMillis(2500),
() -> doSomething());
请注意,您不需要将操作包装在 中Platform.runLater
,因为它已经在 JavaFX 应用程序线程上执行。
于 2014-06-03T21:48:12.900 回答
18
如果您接触任何 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();
于 2013-05-27T11:03:36.400 回答
18
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);
我用了这个,它工作得很好
于 2013-09-06T09:51:31.300 回答