Java中的进度条

时间:2013-09-03 22:40:58

标签: java swing class methods

我有两种方法的代码。

public void fondo() { ... }        //Gathers JFrame Background and system time
public void recuperarDatosInternet() {...} //Connects to a URL and gets data.

当JFrame正在运行时,在开始时需要四到五秒钟来执行这些方法的所有操作。

当它正在加载时,框架显示完全为空,持续3或4秒,直到所有方法都完成,然后框架显示出来并且没有问题。

如何创建一个进度条,向用户显示正在加载的内容? 我并不是指预定采用“4000 ms”的ProgressBar。我指的是一个可以采取任何需要的进度条,并且在方法完成之前条形图不会达到100%。

2 个答案:

答案 0 :(得分:3)

您可以使用SwingWorker。此类启用允许在后台线程中完成耗时的工作,并且在此期间不会保留用户界面。它还具有将工作划分为“块”的功能,并在完成这些工作时更新用户界面。这是进度条所需要的,尽管它取决于您的任务是“可分块的”。上面的链接将您带到此类的JavaDoc,其中包含简单和“chunked”用法的示例。

答案 1 :(得分:2)

如果你在The Event Dispatch Thread中运行繁重的任务,它将冻结直到完成,以避免你可以使用SwingWorker在另一个线程中执行下载。 请按此link查看progressBar的完整示例,特别关注setProgress() publish()process()

示例:

public class MyWorker extends SwingWorker<Integer, String> {

  @Override
  protected Integer doInBackground() throws Exception {
    // Start
    publish("Start Download");
    setProgress(1);

    // More work was done
    publish("More work was done");
    setProgress(10);

    // Complete
    publish("Complete");
    setProgress(100);
    return 1;
  }

  @Override
  protected void process(List< String> chunks) {
    // Messages received from the doInBackground() (when invoking the publish() method)
  }
}

并在客户端代码中:

    SwingWorker worker = new MyWorker();
    worker.addPropertyChangeListener(new MyProgressListener());
    worker.execute();

   class MyProgressListener implements PropertyChangeListener {
      @Override
      public void propertyChange(final PropertyChangeEvent event) {
        if(event.getPropertyName().equalsIgnoreCase("progress")) {
          downloadProgressBar.setIndeterminate(false);
          downloadProgressBar.setValue((Integer) event.getNewValue());
        }         
      }
     }