为了账号安全,请及时绑定邮箱和手机立即绑定

JProgressBar没有进展

JProgressBar没有进展

MM们 2019-10-22 22:35:21
所以我试图做一个下载器,用进度条显示下载进度。但是我遇到了问题,因为它实际上没有更新进度条。当它本来是蓝色时,基本上保持白色。如果有人可以帮助,则下面的代码。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 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

与SwingWorker结合使用。在此处查看示例: SwingWorker和进度栏


@气垫船:你是对的。请允许我参考JavaDoc的相应SwingWorker页面,我认为这最好地说明了情况。


查看完整回答
反对 回复 2019-10-22
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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


主要原因是您阻止了事件调度线程(AKA EDT)的运行,从而阻止了任何重新绘制请求(以及其他UI重要内容)的处理。


你应该通读


Swing中的并发

工人线程和秋千工人

现在,这几乎直接从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();


    }


}

记住秋千的黄金法则


从不,从不从ThreadEDT中更新任何UI组件

始终在其他地方执行耗时的任务 Thread

(关于布局管理器的某些东西,更多是个人问题;)

使用Swing:D,您将度过轻松愉快的时光


查看完整回答
反对 回复 2019-10-22
  • 2 回答
  • 0 关注
  • 665 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信