【问题标题】:JavaFX Progress Dialog On Saving保存时的 JavaFX 进度对话框
【发布时间】:2017-05-22 08:52:40
【问题描述】:

在我的应用程序中,我必须保存一个需要很长时间的 JavaFX UI。在此保存期间,我必须显示一个进度对话框,告诉用户当时发生了什么。

我已经读到应该使用 Task 而不是 JavaFX 线程来运行繁重的任务。但是,由于以下两个原因,这对我来说是不可能的:

1- 繁重的任务包括 JavaFX 确认对话框弹出窗口,如果不被 JavaFX 线程调用,有时会在 MAC 上出现错误。

2- 保存方法必须返回一个布尔值来判断保存是否正常。而这个保存方法是由 JavaFX 线程触发的。这意味着 JavaFX 线程必须返回布尔变量,并且必须等待 Task 完成才能执行此操作。

遗憾的是,JavaFX UI 集成在 Swing UI 中,这使得使用起来更加困难。

【问题讨论】:

  • “繁重的任务包括 JavaFX 确认对话框弹出窗口,如果不被 JavaFX 线程调用,有时会在 MAC 上出现错误”。无论您在什么平台上运行,对话框必须显示在 FX 应用程序线程上。不过,这并不妨碍您在另一个线程上运行后台工作。对于 2. 使用 Task<Boolean> 并使用 setOnSucceeded 处理程序来处理结果。

标签: multithreading javafx progress-bar


【解决方案1】:

Task 只是javafx.concurrent.Worker 接口的一种实现,它提供了与GUI 和JavaFX 线程通信的设施。其他实现是ServiceScheduledService。基本上,区别在于Service 是为重用而设计的,而Task 不是,ScheduledService 可以在执行后自行重启。

所以,为了解决您的两个问题:

繁重的任务包括 JavaFX 确认对话框弹出窗口,如果不被 JavaFX 线程调用,有时会在 MAC 上出现错误。

如前所述,Worker 接口提供了一个很好的 API 来从另一个线程更新 GUI。例如,在 JavaFX 线程中,您可以轻松地将 Labeled 绑定到从后台线程更新的 message 属性。

保存方法必须返回一个布尔值来判断保存是否正常。而这个保存方法是由 JavaFX 线程触发的。这意味着 JavaFX 线程必须返回布尔变量,并且必须等待 Task 完成才能执行此操作。

例如Taskcall()方法可以返回任意对象,其中包括Boolean。而且Worker接口有一个getValue()方法可以从对应的worker中获取结果。

我建议阅读"Concurrency in JavaFX" tutorial 以获取更多信息。对于ProgressBar 本身,请查看"Progress Bar and Progress Indicator" tutorial

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多