JProgressBar没有进展

时间:2012-08-18 17:58:53

标签: java swing jprogressbar

所以我正在尝试使用进度条创建一个显示下载进度的下载程序。 但我遇到问题,因为它实际上并没有更新进度条。基本上它保持白色,当它意味着蓝色。如果有人可以帮忙,代码就在下面。

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){}
}

2 个答案:

答案 0 :(得分:5)

正如@happyburnout指出的那样,你最好在单独的线程中处理下载,使用SwingWorker可能是你正在做的最好的解决方案。

主要原因是你阻止Event Dispatching Thread(AKA EDT)运行,防止处理任何重绘请求(以及其他UI重要事项)。

你应该阅读

现在这几乎是直接来自API文档,但基本了解SwingWoker JProgressBar

“工人”......

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的黄金法则

  • 永远不要永远不要从EDT
  • 以外的任何Thread更新UI组件
  • 始终在其他Thread
  • 上执行耗时的任务
  • (某些东西,某些东西,关于布局管理者 - 这更像是个人的东西;))

你将有一个愉快而轻松的时间与Swing:D

答案 1 :(得分:1)

与SwingWorker结合使用。 在这里查看示例: SwingWorker and Progress Bar

@Hovercraft:你是对的。请允许我参考相应的SwingWorker page of JavaDoc,我认为这最能说明情况。