3

我在使用不是封装类的 SwingWorker 类传递信息、更新进度和指示“完成”时遇到问题。

我有一个简单的类来处理硬盘驱动器上的文件和目录。用户单击“开始”按钮并启动 SwingWorker 的一个实例。

我想打印在来自 SwingWorker 的事件驱动线程中的 JTextArea 上处理的文件的名称作为更新进度条。网上所有的例子都是针对嵌套类的,嵌套类访问的是外部类中的变量(比如done方法)。我还想通知事件驱动线程 SwingWorker 已完成,以便 EDT 可以执行诸如启用“开始”按钮(和清除字段)之类的操作。

以下是我的问题: 1. SwingWorker 类如何将文本放入事件驱动线程的 JTextArea 并更新进度条?

  1. EDT 如何确定 { external } SwingWorker 线程何时完成?

{我不希望 SwingWorker 作为嵌套类,因为已经完成了很多代码(和处理)。}

4

1 回答 1

2

ASwingWorker仍然是一个类,您可以扩展和传递它完成工作所需的任何信息,无论它是否封装在另一个类中。因此,您可以在JTextArea构造函数中将其作为“目标文本区域”传入,将其存储为成员变量,然后在process(List<V>)方法中更新文本区域。

EDT 不会确定工作人员何时完成:工作人员自己知道它已经完成了它的工作,因为doInBackground()方法完成了。包装工作人员的代码检测完成,doInBackground()然后调用done()EDT 上的方法。(swing worker 能够自动为您处理线程中的所有更改,这也是它如此出色的原因之一。)

在您的done()实现中,您可以通过观察者对象回调来通知您的 GUI 完成 - 同样,您可以传递给工作人员的构造函数。

有关如何实现不同方法的描述,请参阅有关 SwingWorker的本教程。进度条上的线索包括有关在摇摆工人中使用进度条的部分。

于 2010-04-24T00:12:35.607 回答