1

だから私はプログレスバーでダウンロードの進行状況を表示するダウンローダーを作ろうとしています。しかし、実際にはプログレスバーが更新されないため、問題が発生しています。それが青であることを意味するとき、基本的にそれは白のままです。誰かが助けてくれるなら、コードは以下の通りです。

JProgressBar progressBar = new JProgressBar(0, ia);
con.add(progressBar, BorderLayout.PAGE_START);
con.validate();
con.repaint();
progressBar = new JProgressBar(0, ia);
progressBar.setValue(0);
System.out.print("Downloading Files");
while ((count = in.read(data, 0, downloadSpeed)) != -1){
    fout.write(data, 0, count);
    if (count >= 2){
        progressBar.setString("Downloading : " + ia + " @ " + count + "Kbs per second");
    } else {
        progressBar.setString("Downloading : " + ia + " @ " + count + "Kb per second");
    }
    progressBar.setValue(count);
    con.add(progressBar, BorderLayout.PAGE_START);
    try{
        Thread.sleep(1000);
    } catch (Exception e){}
}
4

2 に答える 2

5

@happyburnoutが指摘しているように、ダウンロードしたものを別のスレッドで処理する方がよいでしょう。SwingWorkerを使用するのおそらくあなたがしていることに対する最良の解決策です。

主な理由は、イベントディスパッチスレッド(別名EDT)の実行をブロックし、再描画要求(およびその他のUIの重要なもの)が処理されないようにすることです。

読み飛ばす必要があります

現在、これはAPIドキュメントからほぼ直接取得されていますがSwingWokerJProgressBar

働く人"...

public class Worker extends SwingWorker<Object, Object> {

    @Override
    protected Object doInBackground() throws Exception {

        // The download code would go here...
        for (int index = 0; index < 1000; index++) {

            int progress = Math.round(((float)index / 1000f) * 100f);
            setProgress(progress);

            Thread.sleep(10);

        }

        // You could return the down load file if you wanted...
        return null;

    }

「進行状況ペイン」

public class ProgressPane extends JPanel {

    private JProgressBar progressBar;

    public ProgressPane() {

        setLayout(new GridBagLayout());
        progressBar = new JProgressBar();

        add(progressBar);

    }

    public void doWork() {

        Worker worker = new Worker();
        worker.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if ("progress".equals(evt.getPropertyName())) {
                    progressBar.setValue((Integer) evt.getNewValue());
                }
            }

        });

        worker.execute();

    }

}

Swingの黄金のルールを覚えておいてください

  • 決して、決して、ThreadEDT以外のUIコンポーネントを更新しないでください
  • 常に別の場所で時間のかかるタスクを実行するThread
  • (レイアウトマネージャーについての何か、何か、何か-それはもっと個人的なことです;))

そして、あなたはSwing:Dで幸せで簡単な時間を過ごすでしょう

于 2012-08-18T20:22:57.593 に答える
1

SwingWorkerと組み合わせて使用​​します。こちらの例をご覧ください: SwingWorkerとProgress Bar

@ホバークラフト:その通りです。JavaDocの対応するSwingWorkerページを参照させてください。私の意見では、これが状況を最もよく説明しています。

于 2012-08-18T18:01:57.443 に答える