我正在使用下载程序创建Java应用程序。我的问题是,进度条不起作用。我想要我的进度条显示下载进度但失败。这是我的代码的一部分。只是停留在0%的进度...Java - 如何在SwingWorker中使用JProgressBar
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);
}
}
}
是,任何代码错了吗?
文件长度=文件大小?我的下载程序将解析XML文件,并在XML文件中获取“URL”的内容并使用Common-IO进行下载。 – Jeremy
是的,文件长度=文件大小。HTTP协议允许两种方式发送文件 - 老式的HTTP 1.0下载,其中“Content-Length”标题告诉你在下载之前将下载多少字节。 HTTP 1.1提供了“分块”编码,即服务器不断传递小块字节,每个字节前面都有该块中的字节数。在这种情况下,你不知道你正在下载的文件有多长。所以对于分块编码,你不知道你会得到多少字节。 如果你知道平均大小,你可以猜测它... –
但是,无论如何,如果你想显示实际的进展 - 你做了多少百分比 - 你需要一些方法来听下载时,它是在进度并更新它。您始终可以在进度条上执行“不确定”模式,在这种情况下,无需准确了解需要下载多少字节。 –