JavaFX,是否有Platform.runlater()的回调?
我的应用程序通过调用Platform.runlater方法在FX线程上添加多个Runnable,然后,我只想在FX平台队列中没有其他Runnable时进行一些计算。 但我不知道正确的方法,是否有任何事件或回调机制来获得正确的时间?JavaFX,是否有Platform.runlater()的回调?,javafx,testfx,Javafx,Testfx,我的应用程序通过调用Platform.runlater方法在FX线程上添加多个Runnable,然后,我只想在FX平台队列中没有其他Runnable时进行一些计算。 但我不知道正确的方法,是否有任何事件或回调机制来获得正确的时间? 目前,我强制应用程序线程随机休眠毫秒。这从一开始就是个坏主意,因为您不知道其他代码使用的是Platform.runLater。此外,您不应依赖此类实施细节;据你所知,队列永远不会是空的。 但是,您可以使用自定义类发布这些可运行项,该类跟踪可运行项的数量,并在所有操作完
目前,我强制应用程序线程随机休眠毫秒。这从一开始就是个坏主意,因为您不知道其他代码使用的是Platform.runLater。此外,您不应依赖此类实施细节;据你所知,队列永远不会是空的。 但是,您可以使用自定义类发布这些可运行项,该类跟踪可运行项的数量,并在所有操作完成时通知您:
public class UpdateHandler {
private final AtomicInteger count;
private final Runnable completionHandler;
public UpdateHandler(Runnable completionHandler, Runnable... initialTasks) {
if (completionHandler == null || Stream.of(initialTasks).anyMatch(Objects::isNull)) {
throw new IllegalArgumentException();
}
count = new AtomicInteger(initialTasks.length);
this.completionHandler = completionHandler;
for (Runnable r : initialTasks) {
startTask(r);
}
}
private void startTask(Runnable runnable) {
Platform.runLater(() -> {
runnable.run();
if (count.decrementAndGet() == 0) {
completionHandler.run();
}
});
}
public void Runnable runLater(Runnable runnable) {
if (runnable == null) {
throw new IllegalArgumentException();
}
count.incrementAndGet();
startTask(runnable);
}
}
我不知道你想达到什么目的。您的整个处理是从一个反向线程开始的吗?Platform.runlater将在JavaFX应用程序线程上运行代码以及任何GUI事件。我认为,除了显式冻结UI之外,您无法控制GUI事件……您想做的事情将得到更多的描述。为什么在计算之前必须等待JavaFX完成渲染?随机线程睡眠是如何解决问题的?如果您可以反转此过程并从JavaFX应用程序开始线程您可以使用中的实用程序类在后台线程中运行代码。当FX平台队列中没有其他可运行时-这可能永远不会发生。您不知道还有哪些代码提交到该队列,也不知道它们是如何从队列中处理的。你真正想做什么?如果您想阻止后台线程直到Runnable完成,您可以提交FutureTask而不是Runnable,然后调用FutureTask.get,它将阻止直到该任务完成。@Puce,目前我正在使用TestFX包测试JavaFX gui,测试是通过扩展GuiTest类完成的。