我有一个进度条,当我按下按钮时,按钮监听器上我有一个进度条,可以下载更新。但是,GUI会冻结,直到下载完成。 如何继续下载,如何更新此进度条?但是,如果在编译应用程序时开始下载而没有用户干扰,则下载会随着进度条的更新而进行。但是,它与JButton动作监听器完全相反。
如何使用SwingWorker实现此功能?
while((i=in.read(data,0,1024))>=0)
{
totalDataRead=totalDataRead+i;
bout.write(data,0,i);
float Percent=(totalDataRead*100)/filesize;
currentProgress.setValue((int)Percent);
float allP = Percent / 5;
all.setValue((int)allP);
}
这只是循环(没有catchException),在按钮监听器之后,如何在下载时更新GUI?!
答案 0 :(得分:3)
使用SwingWorker
在另一个线程中执行下载。 Here您有progressBar
我非常喜欢的完整示例,请参阅setProgress() publish()和process()。当你使用setProgress()
它是一个绑定属性时你可以接近观察者模式你可以注册一个监听器,然后当这个方法被调用时会被触发并且你可以捕获并更新你的progressBar
并且你也可以解耦组件
示例:
public class MyWorker extends SwingWorker<Integer, String> {
@Override
protected Integer doInBackground() throws Exception {
// Start
publish("Start Download");
setProgress(1);
// More work was done
publish("More work was done");
setProgress(10);
// Complete
publish("Complete");
setProgress(100);
return 1;
}
@Override
protected void process(List< String> chunks) {
// Messages received from the doInBackground() (when invoking the publish() method)
}
}
并在客户端代码中:
SwingWorker worker = new MyWorker();
worker.addPropertyChangeListener(new MyProgressListener());
worker.execute();
class MyProgressListener implements PropertyChangeListener {
@Override
public void propertyChange(final PropertyChangeEvent event) {
if(event.getPropertyName().equalsIgnoreCase("progress")) {
downloadProgressBar.setIndeterminate(false);
downloadProgressBar.setValue((Integer) event.getNewValue());
}
}
}
答案 1 :(得分:0)
SwingWorker是这样做的方法:http://java.dzone.com/articles/multi-threading-java-swing但是,使用它非常棘手。
另一种选择是一个名为Foxtrot的非常小的框架:http://foxtrot.sourceforge.net/docs/