我正在使用下载程序创建Java应用程序。我的问题是,进度条不起作用。我希望我的进度条显示下载进度但失败了。这是我的代码的一部分。进度条刚刚停留在0%......
Download.class
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);
}
}
}
这是否有任何错误?
答案 0 :(得分:2)
这种事情听起来不那么微不足道。 copyURLToFile()
将一直阻止,直到副本完成,这样只会给你两个事件 - 0%和100%。
如果要在下载过程中显示进度,则有一个先决条件:在下载开始之前必须知道文件长度(这样您才能计算百分比)。您可以通过在开始复制之前发出HTTP HEAD
请求来获得 - 但是响应中的Content-Length
字段是否依赖于服务器 - 对于分块编码,您不会得到此信息(尽管您可能会强制某些服务器通过发出HTTP 1.0请求来告诉您)。如果做不到这一点,你可以作弊并选择任意数量的字节。
一旦你有了长度或近似值,你可以
InputStream
打开URL并执行自己的循环以复制字节,并在每次循环迭代时更新进度条无论哪种方式,请确保使用EventQueue.invokeLater()
更新进度条的value
属性,否则可能会出现死锁问题 - 从事件线程的任何线程修改Swing组件是不安全的。< / p>
答案 1 :(得分:1)
阅读How to Use Progress Bars上Swing教程中的部分,了解使用SwingWorker的工作示例。
从有效的东西开始,并根据您的特定要求进行更改。如果您仍有问题,请发布一个显示问题的SSCCE
。