有人告诉我,我需要为长时间运行的目录树walker创建一个SwingWorker
,其“内容”如下所示。 (为了简短起见,我删除了很多}和)和其他多余(对我的问题)的东西,例如忽略的catch子句。)
当匹配给定的文件名模式时,report()
将文件名(和其他内容)写入文本区域:
public class TASK extends SimpleFileVisitor<Path> implements Runnable{
public static FileVisitResult disposition = FileVisitResult.CONTINUE;
private static void report(String s){
try{
Output.jTextArea1.append(s + "\n");
catch (Exception e){ aborted = true ; disposition = FileVisitResult.TERMINATE;}
public void run() {
disposition = FileVisitResult.CONTINUE;
Files.walkFileTree(p , this); // walkTreeFile calls visitFile() for each file.
public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException {
report(f1.getFileName().toString());
return disposition;
main()
只是为GUI和输出创建线程: public static void main(String args[]) { // main
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
gui = new GUI();
gui.setVisible(true);
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
info = new Output();
单击“搜索”按钮时,
jbSearch...()
使输出窗口可见并实例化TASK
,然后开始进行树遍历: private void jbSearchActionPerformed(ActionEvent evt) { // this is in GUI
try {
TASK v = new TASK();
Thread t = new Thread(v);
t.start();
一切正常,但输出窗口闪烁并被黑,因此我需要SwingWorker。但是我不能说以下内容,因为
TASK
(或其他内容)必须扩展SimpleFileVisitor
: class TASK extends SwingWorker<List<String>, String>
所以我正在寻找实现的东西。我的笔记告诉我“因为SwingWorker实现了Runnable,所以SwingWorker可以提交给
Executor
以便执行”,因此我认为除非有人阻止我,否则我将继续前进。 (我以前从未使用过执行程序。)在弄清楚如何参与SwingWorker之后,我假设我应该做以下事情,可能代替
jbSearch...()
来显示所示的3行(恰好在上方): TASK.execute();
我想我必须让
doInBackground()
调用visitFile(),这是应用于遍历中的所有文件的。填写doInBackground()
返回的数组是我的责任吗? SwingWorker的Java教程突然返回numbers
,它在任何地方都没有定义为数组或其他任何东西。所以我想我必须进行
process()
调用(我的)report()
,它将新信息附加到输出窗口(文本区域)。我假设一旦doInBackground()
填充了大块的数组,将很容易对其进行处理。但是我在哪里放
get()
? SwingWorker的Java教程建议不要使用get()
,因为该示例写入文本区域,并且get()
仅与System.out一起使用,以在控制台上显示相同的信息。(编辑)哦,是的。。。我
publish()
是什么?我想我在report()
内部发布。但是,无论如何我都在发帖,因为我认为问题和/或答案可能是对有人问关于SwingWorker的下一个问题的宝贵发现。
(编辑)我认为我面临的一个大问题是
walkFileTree
或多或少“是”一个循环,在后台重复调用visitFile()
,直到树结束或visitFile()
中的返回值设置为时结束TERMINATE
。那么我是否只是将visitFile()
粘贴在doInBackground()
中,因为它已经或多或少已经处于循环中了?然后紧跟publish()
吗?但是那我该如何返回一个数组呢?
g
最佳答案
所以我正在寻找实现的东西。我的笔记告诉我“因为
SwingWorker实现Runnable,可以将SwingWorker提交给
执行官执行”,所以我认为我下一步要去那里,除非
有人阻止我! (我以前从未使用过执行程序。)
在弄清楚如何参与SwingWorker之后,我认为我应该做
以下,可能在jbSearch ...()中代替了显示的3行
(正上方):
TASK.execute();
是的,SwingWorker#execute
是启动SwingWorker的典型方法
我想我必须让doInBackground()调用visitFile(),这是
适用于遍历中所有文件的内容。这是我的责任吗
填充doInBackground()返回的数组?的Java教程
SwingWorker突然返回未在任何地方定义的数字
是数组或其他任何东西。
您要在后台执行的任何操作都应从此方法调用。
是的,您需要自己生成结果。实际值可以在任何地方定义,但我个人在doInBackground
方法的上下文内定义局部变量
所以我想我必须让process()调用(my)report(),该追加
新信息到输出窗口(文本区域)。我以为曾经
doInBackground()填充大块数组,将很容易处理
他们。
为了处理值,您需要先publish
它们。将这些值传递给process
的时间将取决于您的后台处理强度。
覆盖done
并调用get还将使您能够在EDT上下文中访问从doInBackground
返回的内容
但是我应该把get()放在哪里? SwingWorker的Java教程
建议不要使用get(),因为该示例写入了
文本区域和get()仅与System.out一起使用以显示相同的内容
控制台上的信息。如果我不需要调用get(),也许我更近了
当我开始时想到的解决方案。
这将取决于。您是否关心结果?如果这样做,我倾向于在done
方法中调用它,因为通常,我想使用EDT中的值。
关于get
的重要信息是它正在阻塞,也就是说,它将等到doInBackground
返回
对于example