Java Swingworker:不是封装类

3
我有一个简单的类,用于处理硬盘上的文件和目录。用户点击“开始”按钮后,启动一个SwingWorker实例。但是我在使用一个非封装类的SwingWorker类时遇到了传递信息、更新进度和指示“完成”的问题。
我想在事件驱动线程中使用JTextArea打印已处理的文件名,并更新进度条。所有网络上的示例都是针对嵌套类的,并且嵌套类访问外部类中的变量(例如done方法)。我还想向事件驱动线程发出信号,表示SwingWorker已经完成,以便EDT可以执行诸如启用“开始”按钮(和清除字段)等操作。
以下是我的问题: 1. SwingWorker类如何将文本放入事件驱动线程的JTextArea并更新进度条? 2. EDT如何确定{外部}SwingWorker线程何时完成?
{我不想将SwingWorker作为嵌套类,因为其中有很多代码(和处理)}。
1个回答

2
一个SwingWorker仍然是一个你可以扩展的类,并且可以传递任何它需要执行其任务的信息,无论它是否封装在另一个类中。因此,您可以将JTextArea作为“目标文本区域”传递到构造函数中,将其存储为成员变量,然后在process(List<V>)方法中更新文本区域。
EDT并不确定工作者何时完成:工作者本身知道它已经完成了它的工作,因为doInBackground()方法已经完成。包装工作者的代码检测到doInBackground()的完成,然后在EDT上调用done()方法。(Swing Worker自动处理线程中的所有更改的能力是使其如此出色的原因之一。)
在您的done()实现中,您可以通过观察者对象回调来通知GUI已完成 - 再次提醒,这是您可以传递给工作者构造函数的东西。
请参阅SwingWorker的教程,了解如何实现不同的方法。有关在Swing Worker中使用进度条的内容,请参见进度条

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接