我有一个用于数据分析的应用程序。该应用程序的一大部分是能够根据收集的数据显示图表的能力,并且能够在一次批处理操作中导出大量任务。到目前为止,我使用的是JFreeChart,但我想使用原生的JavaFX图表,以便导出的图表看起来仍然与应用程序中屏幕上的图表相同。
我使用的是JavaFX 2.2.1 (JDK7u6)。
我可以在一批中生成图表,但这意味着我必须冻结用户界面(UI),因为这些图表必须在JavaFX应用程序线程上呈现。为此,我使用了Platform.runLater(new Runnable() { ... });命令,该命令包含生成图表的代码。
对于这个特定的事件,我想向用户显示一个进度条,我希望这个进度条随着实际的图表生成而更新。
对于如何实现这一点,有什么建议或提示吗?
发布于 2013-02-13 04:46:00
这个问题在Oracle JavaFX论坛中得到了解决:Render charts in background。
解决方案是有一个包含三个子任务的SaveChartsTask:
imageio例程将JavaFX图像导出到文件。任务的workDone属性允许监视操作的过程。通过将全部工作拆分为子任务,尽可能将工作从JavaFX应用程序线程中分离出来,并根据需要使用CountDownLatches和BlockingQueues来同步操作,UI能够保持响应能力。
发布于 2012-11-05 21:43:33
因为您似乎是JavaFX-2的新手。我建议您阅读oracle文档中的JavaFX-2 Concurrency文章。
您的问题很容易解决,只需使用Task对象单独加载图表(例如,每个图表一个任务)。引用教程页面:
任务用于实现需要在后台线程上完成的工作逻辑。
由于任务实现了Work接口,因此您可以使用任务来探测它们的Worker.State。引用手册:
可重用的工作器将从取消、成功或失败状态转换回就绪状态。
这将解决您的反馈问题,因为您将始终能够知道任务是否仍在运行,因为Worker.State对象具有以下可能的状态:
至于进度条,您可以使用updateProgress(double done, double max)来设置任务进度,然后通过将ProgressBar.progressProperty()绑定到Task.progressProperty()来简单地设置进度条的进度。
编辑
回复您的评论:
问题在于,在这种情况下,在生成JavaFX图表时,在任务内部执行的工作,以及需要在JavaFX应用程序线程内部执行的代码
来自本教程:
改为使用javafx.concurrent包提供的JavaFX API,该包负责与UI交互的多线程代码,并确保此交互发生在正确的线程上。
这意味着在JavaFX对象中执行的代码已经在Task线程中执行。
我希望它能帮上忙。干杯
发布于 2013-02-13 04:11:43
要在jfx线程上运行JavaFX Task,可以将任务安排为使用Platform.runLater(myJFXTask);运行。
https://stackoverflow.com/questions/13232578
复制相似问题