使用递归方法发布Java SwingWorker进程

时间:2014-11-04 09:32:47

标签: java swing swingworker

我有一个递归方法,它从用户获取一个文件路径列表,并递归迭代它们以查找所有文件。这可能需要一段时间,所以我需要一个进度对话框。我编写了一个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()吗?

2 个答案:

答案 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();