似乎长时间运行的 tree walker 任务应该在这样的类中定义:
public class TreeWalker extends SwingWorker<Void,String> implements FileVisitor<Path>
并开始这样的地方:
TreeWalker walker = (new TreeWalker());
walker.execute();
长时间运行的任务不仅由对类中的方法的一次调用发起,而且完全由其执行。所以肯定对它的调用必须在.walkFileTree()
Files
doInBackGround()
protected Void doInBackground() throws Exception {
Files.walkFileTree(SearchyGUI.p , this);
return null;
}
请注意,walkTreeFile()
内部会为遇到的每个文件调用四个方法。程序员编写的循环是不可行的。所以这是我的问题。如何使用publish()
将文件信息作为字符串发送到process
我需要覆盖的方法?我见过的例子有publish()
inside doInBackground()
,但是在一个循环中,这在这里是不可能的。
我最关心的四种方法之一是visitFile()
,它walkFileTree()
需要能够找到,我怀疑这是放置的地方publish()
:
public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException {
if (...we want this file...)
publish(f.toString());
return CONTINUE;
}
我可以将 walkFileTree() 调用的所有 4 个方法放在内部类 insidedoInBackground()
中,但这似乎是一厢情愿的想法。
PS我不能用get()
;这就是重点(据我所知)——获得结果的延迟太长(可能要处理数千个文件才能找到十几个文件)才能等到 doInBackground() 结束。
===========================================
编辑#3,原始发布时间后 50 分钟
public static void doIt(){
try {
System.out.println("It begins..."); // This does happen.
TreeWalker walker = new TreeWalker();
walker.execute();
SearchyGUI.info.setVisible(true); // Form is displayed, stays blank.
}
catch (Exception e) { System.out.println("Uh-oh"); } // This does NOT happen.
}
===========================================
(编辑#2,发布后 40 分钟)
这是我的处理方法。println 没有执行。
protected void process(String s) {
System.out.println("in process()...");
report(s); // my method to append text area with another line of file info
}
此外,包含的类语句doInBackground()
已更改:
public class TreeWalker extends SwingWorker<Void, String> implements Runnable{
该类Walking
嵌套在doInBackground()
.
===========================================
(编辑,发布后 20 分钟)
这编译但什么也没做:
protected Void doInBackground() throws Exception
{
class Walking implements FileVisitor<Path>
{
@Override
public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException
{
String modifyDate = a.lastModifiedTime().toString().substring(0,10);
String fpathname = f.toString();// + "\\" + f.getFileName().toString());
if (...we want this one...)
publish(f.getFileName());
return disposition;
}
... other methods excluded
} // end inner class
System.out.println("walking??"); // We get here ...
Files.walkFileTree(SearchyGUI.p , (FileVisitor<? super Path>) this);
System.out.println("Finished walking??"); // ... but not here.
return null;
} // end of doInBackground()
==============================
...另一个怪异的编辑...我现在的班级定义...
public class GUI extends JFrame implements ActionListener, MouseListener, KeyListener
public class TreeWalker extends SwingWorker<Void, String> implements Runnable{
protected Void doInBackground() throws Exception {
class Walking implements FileVisitor<Path>{ // CLASS INSIDE doInBackground
... zzzzzzzzzzzzzzzzzzz ......