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

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

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

目前我已经尝试使用这种方法:

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

where命令是创build过程的方法:

 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; } 

任何帮助,将不胜感激。

在这个完整的例子中 , SwingWorker的后台方法启动了一个ProcessBuilder 。 标准输出和错误流组合在一起显示在文本组件中。 用您的wget命令替换看看效果。 --progress=bar并一次读一个字符。

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

你并不需要SwingWorker 。 只需下载一个单独的Thread (不要在EDT中执行),并且每次遇到来自wget的新点行输出时,都会更新一个GUI组件(例如进度条),但在EDT中执行此更新与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()); } }); } }