我在使用不是封装类的SwingWorker类传递信息,更新进度和指示“完成”时遇到问题。
我有一个简单的类来处理硬盘上的文件和目录。用户单击“开始”按钮,然后启动SwingWorker的实例。
我想从SwingWorker打印事件驱动线程中JTextArea上处理的文件的名称作为更新进度条。 Web上的所有示例都是针对嵌套类的,嵌套类访问外部类中的变量(例如done
方法)。我还想向事件驱动线程发出SwingWorker完成信号,以便EDT可以执行诸如启用“开始”按钮(和清除字段)等操作。
以下是我的问题: 1. SwingWorker类如何将文本放入事件驱动线程的JTextArea并更新进度条?
{我不希望SwingWorker成为嵌套类,因为已经完成了很多代码(和处理)。}
答案 0 :(得分:2)
SwingWorker
仍然是一个类,您可以扩展并传递它完成工作所需的任何信息,无论它是否封装在另一个类中。因此,您可以在构造函数中将JTextArea
作为“目标文本区域”传递,将其存储为成员变量,然后使用process(List<V>)
方法更新文本区域。
EDT无法确定工作人员何时完成:工作人员自己知道已完成其工作,因为doInBackground()
方法已完成。包装工作程序的代码检测到doInBackground()
的完成,然后在EDT上调用done()
方法。 (swing工作者自动处理线程中所有更改的能力是使其如此优秀的原因之一。)
在done()
实现中,您可以通过观察者对象回调来通知GUI完成 - 再次,您可以传递给工作者的构造函数。
有关如何强制使用不同方法的说明,请参阅此tutorial on SwingWorker。 progress bars上的跟踪包括一个关于在摇摆工作者中使用进度条的部分。