Java Swingworker:不是封装类

时间:2010-04-23 23:24:51

标签: java swingworker jtextarea jprogressbar

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

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

我想从SwingWorker打印事件驱动线程中JTextArea上处理的文件的名称作为更新进度条。 Web上的所有示例都是针对嵌套类的,嵌套类访问外部类中的变量(例如done方法)。我还想向事件驱动线程发出SwingWorker完成信号,以便EDT可以执行诸如启用“开始”按钮(和清除字段)等操作。

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

  1. EDT如何确定{外部} SwingWorker线程何时完成?
  2. {我不希望SwingWorker成为嵌套类,因为已经完成了很多代码(和处理)。}

1 个答案:

答案 0 :(得分:2)

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

EDT无法确定工作人员何时完成:工作人员自己知道已完成其工作,因为doInBackground()方法已完成。包装工作程序的代码检测到doInBackground()的完成,然后在EDT上调用done()方法。 (swing工作者自动处理线程中所有更改的能力是使其如此优秀的原因之一。)

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

有关如何强制使用不同方法的说明,请参阅此tutorial on SwingWorkerprogress bars上的跟踪包括一个关于在摇摆工作者中使用进度条的部分。