使用SwingWorker / Swing跟踪wget(bash)的进度

时间:2014-08-14 06:36:14

标签: java linux swing bash swingworker

我正在尝试制作一个gui,用户可以下载文件。目前我可以通过一个进程调用wget命令,但我很难将它与swingworker一起使用。

我如何同时跟踪下载和更新gui的进度?

目前我尝试过使用此方法:

ShellProcess.command("wget --progress=dot "+_url);

其中command是创建进程的方法:

InputStream stdout = _process.getInputStream();
    BufferedReader stdoutBuffered =new BufferedReader(new InputStreamReader(stdout));


    String line = null;
    String output ="";
    try {
        while ((line = _stdoutBuffered.readLine()) != null ) {
            //              System.out.println(line);
            output+=(line+" ");
            System.out.println(line +" SHELL");
            _progress++;
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    _progress = 0;
    return output;

}

我正在尝试将输出的行数计算为" wget --progress = dot"应该为每一个进度百分比输出一行。但这似乎不起作用。

swingworker里面的doInBackground方法看起来像这样:

    @Override
protected Integer doInBackground() throws Exception {
    // Start
    download .command("wget "+_url);
    ShellProcess.command("wget --progress=dot "+_url);
    int progress = 0;
    while (progress<101){
        progress = ShellProcess.getProgress() %100 ;
        publish(ShellProcess.getOutput());
        setProgress(progress);

    }
    return 1;
}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

在这个完整的example中,SwingWorker的背景方法会启动ProcessBuilder。组合标准输出和错误流以在文本组件中显示。替换wget命令以查看效果。尝试--progress=bar并一次阅读一个角色。

ProcessBuilder pb = new ProcessBuilder("wget", "--progress=dot", url);

答案 1 :(得分:1)

你真的不需要SwingWorker。只需单独下载Thread(不要在EDT中执行),每次遇到wget的新点线输出时,更新GUI组件(例如进度条),但执行此更新在美国东部时间,例如与SwingUtilities.invokeLater()

JProgressBar progressBar = ...; // Initialize and add progress bar to your GUI
...

// In your separate download thread:
final AtomicInteger percent = new AtomicInteger();

while ((line = _stdoutBuffered.readLine()) != null ) {
    if (".".equals(line)) {
        // A new percent was completed, update the progressbar:
        percent.incrementAndGet();

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                progressBar.setValue(percent.get());
            }
        });
    }
}