[英]Java - How to use JProgressBar with SwingWorker
我正在使用下载器创建Java应用程序。 我的问题是,进度栏无法正常工作。 我希望进度条显示下载进度,但失败了。 这是我的代码的一部分。 进度栏仅停留在0%...
下载类
public void startDownload()
{
ExecutorService executor = Executors.newSingleThreadExecutor();
FutureTask<Void> verDownloader = new FutureTask<Void>(vd);
FutureTask<Void> launcher = new FutureTask<Void>(dd);
executor.execute(verDownloader);
executor.execute(launcher);
executor.shutdown();
}
VersionDownloader.class
public class VersionDownloader implements Callable<Void>, PropertyChangeListener
{
@Override
public Void call() throws Exception
{
done = false;
final SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>()
{
@Override
protected Void doInBackground() throws Exception
{
try
{
URL fileURL = new URL(url);
org.apache.commons.io.FileUtils.copyURLToFile(fileURL, path);
}
catch(Exception e)
{
}
return null;
}
@Override
public void done()
{
done = true;
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
};
worker.execute();
worker.addPropertyChangeListener(this);
worker.get();
}
}
}
catch(Exception e)
{
}
return null;
}
@Override
public void propertyChange(PropertyChangeEvent evt)
{
if(!done)
{
int progress_a = progress;
//launcher.frame.progress is a JProgressBar
launcher.frame.progress.setValue(progress_a);
}
}
}
那是任何代码错误吗?
这种事情听起来并不简单。 copyURLToFile()
将阻塞直到复制完成为止,因此只会给您两个事件-0%和100%。
如果要在下载时显示进度,则有一个先决条件:在下载开始之前,您必须知道文件长度 (以便可以计算百分比)。 您可能会获得-可能-通过在开始复制之前发出HTTP HEAD
请求-但响应中是否存在Content-Length
字段取决于服务器-对于分块编码,您不会获得此信息(尽管您可能能够通过发出HTTP 1.0请求来强制某些服务器告知您)。 失败的话,您可以欺骗并选择任意数量的字节。
一旦有了长度或近似值,就可以
InputStream
并进行自己的循环以复制字节,并在每次循环迭代中更新进度条 无论哪种方式,请确保使用EventQueue.invokeLater()
更新进度条的value
属性,否则您可能会遇到死锁问题-从事件线程之外的任何线程修改Swing组件都是不安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.