我正在尝试制作一个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;
}
任何帮助都将不胜感激。
答案 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());
}
});
}
}