Java JProgressBar不是';没有进展

Java JProgressBar不是';没有进展,java,swing,jprogressbar,Java,Swing,Jprogressbar,所以我想制作一个下载程序,用进度条显示下载进度。 但我有问题,因为它实际上没有更新进度条。基本上它是白色的,当它是蓝色的时候。如果有人能帮忙,代码如下 JProgressBar progressBar = new JProgressBar(0, ia); con.add(progressBar, BorderLayout.PAGE_START); con.validate(); con.repaint(); progressBar = new JProgressBar(0, ia); progr

所以我想制作一个下载程序,用进度条显示下载进度。 但我有问题,因为它实际上没有更新进度条。基本上它是白色的,当它是蓝色的时候。如果有人能帮忙,代码如下

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

与SwingWorker结合使用。 请参见此处的示例:


@气垫船:你说得对。请允许我参考相应的,我认为这最好地解释了这种情况。

与SwingWorker结合使用。 请参见此处的示例:


@气垫船:你说得对。请允许我参考相应的,在我看来,这最好地解释了这种情况。

正如@happyburnout所指出的,您最好在单独的线程中处理您的下载,对于您正在做的事情,使用a可能是最好的解决方案

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

你应该通读一遍

现在,这几乎直接取自API文档,但给出了带有
JProgressBar

“工人”

记住挥杆的黄金法则

  • 决不,决不,决不从EDT以外的任何
    线程
    更新UI组件
  • 始终在不同的
    线程上执行耗时的任务
  • (一些,一些,一些关于布局管理器的事情——这更像是个人的事情;)

正如@happyburnout所指出的那样,您将在Swing:D上度过一段愉快而轻松的时光,您最好在单独的线程中处理您下载的内容,对于您正在做的事情,使用a可能是最好的解决方案

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

你应该通读一遍

现在,这几乎直接取自API文档,但给出了带有
JProgressBar

“工人”

记住挥杆的黄金法则

  • 决不,决不,决不从EDT以外的任何
    线程
    更新UI组件
  • 始终在不同的
    线程上执行耗时的任务
  • (一些,一些,一些关于布局管理器的事情——这更像是个人的事情;)

使用Swing:D,您将有一段愉快而轻松的时光。您可能想看看本教程。一般来说,如果您的代码在事件分派线程(EDT)中运行,那么在完成之前,将不会进行GUI更新。这就是为什么您需要使用SwingWorker的原因-这样您就可以将代码从EDT中拉出,并让GUI更新发生。您可能需要查看教程。通常,如果您的代码在事件调度线程(EDT)中运行,则在完成之前不会发生GUI更新。这就是为什么你需要使用SwingWorker,这样你就可以将你的代码从EDT中拉出来,让GUI更新发生。你可能想花点时间说原版海报做错了什么,为什么你的建议会帮助他。你可能想花点时间说原版海报做错了什么,为什么你的建议会有帮助他。啊,现在我明白“气垫船”的意思了。。。很好的解释。我“有点”过火了,但我通常是这样;)-如果你提到EDT并指出一些例子,我就不会发布了,但是HovercraftFullOfEels启发了meAh,现在我明白了@Hovercraft的意思了。。。很好的解释。我“有点”过火了,但我通常是这样;)-如果你提到EDT并指出一些例子,我就不会发布,但HovercraftFullOfEels启发了我
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();

    }

}