我有一个递归方法,它从用户获取一个文件路径列表,并递归迭代它们以查找所有文件。这可能需要一段时间,所以我需要一个进度对话框。我编写了一个SwingWorker线程,试图将每个文件发布到进度对话框。但是,因为我的方法具有递归性质,所以它需要在自己的方法中,而不是SwingWorker库提供的doInBackground()方法。
以下是我的SwingWorker代码的简化版本:
SwingWorker<Boolean, String> worker = (new SwingWorker<Boolean, String>() {
protected Boolean doInBackground() throws Exception {
for (int i = 0; i < model.size(); i++) {
File currentDir = new File(model.get(i));
searchFiles(currentDir); // The recursive method
}
return true;
}
protected void process(List<String> chunks) {
jpanel.someLabel.addFile(chunks.toString());
}
});
worker.execute();
以下是我的递归代码的简化版本:
private void searchFiles(File fn) {
if (fn.isDirectory()) {
String[] subDir = fn.list();
if (subDir != null) {
for (String fn2 : subDir) {
searchFiles(new File(fn, fn2));
}
}
} else { // If fn isn't a directory, then it must be a file
String absoluteFile = fn.getAbsoluteFile().toString();
publish(absoluteFile); // This isn't working... How can I get this method to publish to process()?
}
}
我有办法从另一种方法调用publish()吗?
答案 0 :(得分:1)
澄清接受答案中的内容:
您发布的代码和这句话:
所以问题的答案是,不能从另一种方法调用publish()。
因为你实际上在另一个方法中使用了publish()而互相无效:)(实际上它是在doInBackground()中,因为你在那里调用另一个方法:))
您的publish()方法不起作用的原因写在这里: https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#publish(V...)
protected final void publish(V ... chunk)
这意味着在Swing-package之外看不到publish()。
最后你可以从其他方法调用publish(),例如SwingWorker自己的done()方法甚至是它的构造函数
答案 1 :(得分:0)
由于发布()方法的SwingWorker文档显示link
将数据块发送到进程(java.util.List)方法。此方法将在 doInBackground 方法内部使用,以提供中间结果,以便在流程方法中的事件调度线程上进行处理。
所以问题的答案是,不能从另一种方法调用publish()。
但是,如果您真的想在递归方法中调用publish(),则可以将递归方法移动到SwingWorker类中。像这样:
SwingWorker<Boolean, String> worker = (new SwingWorker<Boolean, String>() {
protected Boolean doInBackground() throws Exception {
for (int i = 0; i < model.size(); i++) {
File currentDir = new File(model.get(i));
searchFiles(currentDir); // The recursive method
}
return true;
}
protected void process(List<String> chunks) {
jpanel.someLabel.addFile(chunks.toString());
}
private void searchFiles(File fn) {
if (fn.isDirectory()) {
String[] subDir = fn.list();
if (subDir != null) {
for (String fn2 : subDir) {
searchFiles(new File(fn, fn2));
}
}
} else { // If fn isn't a directory, then it must be a file
String absoluteFile = fn.getAbsoluteFile().toString();
publish(absoluteFile);
}
}
});
worker.execute();