java - SwingWorker 的替代品或在这种情况下如何实现它......?

标签 java swing user-interface swingworker

我在 EDT 中运行了数百个不同的函数。其中很多包括长时间运行的任务,还有一些包括对 GUI 的更改。有时 GUI 会因用户而挂起,但很难跟踪发生这种情况的所有位置,因为 GUI 挂起并非 100% 的时间都发生在同一区域。该问题的优先级不高,因为挂起通常在窗口最小化/最大化后开始工作,但最终需要完成。

经过一些研究,我发现我可以在 SwingWorker 下使用 doInBackground()对于任何具有劳动密集型工作的方法,并使用 done() 进行 GUI 绘图。我也相信我可以使用 SwingUtilities.invokeLater对于恰好在 doInBackground() 函数中的每个 GUI 绘图。但是,我想避免调整代码中数百个函数中的每一个。

有没有一种方法可以使用单个 SwingWorker 并将任何长时间运行的方法发送到 doInBackground() 函数?对每个错位的 GUI 代码(其中将使用 SwingWorker)多次使用 invokeLater 函数不是问题,因为它不是那么频繁。

如果这不可能,我可以使用某种替代方法吗?谢谢。

最佳答案

所有更新 GUI 的方法都必须在 EDT 上调用,否则您最终可能会遇到一些无法解释的 GUI 行为(听起来像您所看到的)。您可能会遇到未正确发生的重绘、线程竞争等。

不建议在 GUI 上运行长时间运行的任务,因为它们会导致 GUI 变得无响应,因此对于长时间运行的任务,SwingWorker 是一个很好的解决方案(注意在 process 和 done 方法上调用EDT 自动进行,因此您的工作人员可以在 doInBackground 中完成其长时间运行的工作,但您可以安全地更新 GUI,而无需使用 done 方法中的 SwingUtilities.invokeLater。

正如您提到的,您有数百种方法并且您不想每次都调用 SwingUtilities.invokeLater,您可能需要查看其中一个任务框架。 Swing 应用程序框架是 JSR-296 下的开发人员 http://java.sun.com/developer/technicalArticles/javase/swingappfr/但没有得到积极支持,但仍然提供了一个很好的框架。 http://en.wikipedia.org/wiki/Swing_Application_Framework是替代框架的列表。

听起来您需要在应用程序中进行一些重要的重写。从 EDT 外部调用 GUI 方法是不安全的。

关于java - SwingWorker 的替代品或在这种情况下如何实现它......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10787263/

相关文章:

java - RecyclerView水平滚动到左侧

java - 部署程序集配置不适用于 mvn 包

Java错误: illegal start of the expressions

c++ - 编译和执行 Qt 应用程序

java - 从存储获取视频信息不起作用

java - 显示下一个面板时更新 CardLayout 中的 JLable

java - 如何限制在窗体或面板的边框内动态添加组件

java - 如何自动调整 JFrame 上图表的大小?

java - 在 Netbeans GUI Builder 中,如何使图像根据父 JLabel 的大小自动缩放其大小?

ios - 如何使用独立的 NIB 制作标签栏应用程序?