[英]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.