我有两种方法的代码。
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%。
答案 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());
}
}
}