簡體   English   中英

Java-如何在SwingWorker中使用JProgressBar

[英]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請求來強制某些服務器告知您)。 失敗的話,您可以欺騙並選擇任意數量的字節。

一旦有了長度或近似值,就可以

  • 運行計時器並定期檢查到目前為止已下載的字節數,並將其與大小進行比較,或者
  • 打開URL作為InputStream並進行自己的循環以復制字節,並在每次循環迭代中更新進度條

無論哪種方式,請確保使用EventQueue.invokeLater()更新進度條的value屬性,否則您可能會遇到死鎖問題-從事件線程之外的任何線程修改Swing組件都是不安全的。

閱讀Swing教程中有關如何使用進度條的部分, 獲取使用SwingWorker的工作示例。

從可行的方法開始,並針對您的特定要求進行更改。 如果仍然有問題,請發布一個SSCCE來演示問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM