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

最佳答案

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

主要原因是您阻止了 Event Dispatching Thread (AKA EDT) 运行,阻止处理任何重绘请求(和其他 UI 重要的事情)。

你应该通读一遍

现在这几乎是直接取自 API 文档,但给出了一个带有 JProgressBarSwingWoker 的基本概念

“ worker ”...

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 组件
  • 始终在不同的线程上执行耗时任务
  • (关于布局管理器的某事,某事,某事 - 这更像是个人的事;))

您将在 Swing 中度过愉快而轻松的时光:D

关于java - JProgressBar 没有进展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12020949/

相关文章:

java - 通过 REST Controller 使用 Spring Data JPA 和 QueryDsl 的异常

java - 数字格式异常 : empty string when clicking the JButton?

java - 集成 JPA2.0 和 Spring

java - TaskManager for linux - Java Swing 在 Linux 上工作吗?

Java Swingworker : Not as encapsulated class

java - JProgressBar 不只在 Mac 上使用 Java 1.7 进行动画处理

java - 如何异步触发JProgressBar?

java - 从另一个类调用一个类

java - 如何在java swing中生成这个布局

java - TableModelListener 并不总是工作