我正在使用Java功能从互联网上下载文件。
public void getLatestRelease()
{
try
{
// Function called
long startTime = System.currentTimeMillis();
// Open connection
System.out.println("Connecting...");
URL url = new URL(latestReleaseUrl);
url.openConnection();
// Download routine
InputStream reader = url.openStream();
FileOutputStream writer = new FileOutputStream("release.zip");
byte[] buffer = new byte[153600];
int totalBytesRead = 0;
int bytesRead = 0;
while ((bytesRead = reader.read(buffer)) > 0)
{
writer.write(buffer, 0, bytesRead);
buffer = new byte[153600];
totalBytesRead += bytesRead;
}
// Download finished
long endTime = System.currentTimeMillis();
// Output download information
System.out.println("Done.");
System.out.println((new Integer(totalBytesRead).toString()) + " bytes read.");
System.out.println("It took " + (new Long(endTime - startTime).toString()) + " milliseconds.");
// Close input and output streams
writer.close();
reader.close();
}
// Here I catch MalformedURLException and IOException :)
}
我的JProgressBar
中有JPanel
个组件,它应该可视化下载进度:
private static void createProgressBar(JPanel panel)
{
JProgressBar progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
panel.add(progressBar, BorderLayout.SOUTH);
}
我想将“后端”功能与呈现给用户的“前端”视图分开,类似于Web应用程序中的MVC。
因此,函数getLatestRelease()
位于类framework
中的MyFramework
个包中。
与Swing
接口生成相关联的所有内容(包括事件侦听器)都在包frontend
中。
在主Controller
课程中,我创建了MyFramework
的实例和ApplicationFrontend
的实例,这是frontend
包的主要类。
问题是如何更新progressBar
值,具体取决于下载进度?
答案 0 :(得分:7)
如果你想在摇摆中做MVC,可以想到SwingWorker
课程
SwingWorker附带了一个名为“progress”的属性,您可以使用PropertyChangeListener
收听。
可以使用setProgress(int 0-100)
方法从swingworker中触发进度事件。所以这里是用于在后台加载具有进度概念的文件(请注意,您需要知道文件的大小才能计算进度百分比)。
显示进度可以使用两个选项完成:JProgressBar
表示完全控制,或ProgressMonitor
表示几乎自我管理的弹出窗口,其中包含进度条。请参阅tutorial以查看差异。
正如他们所说,如果您选择ProgressMonitor
并且您的后台任务正在从InputStream
读取,则您可以使用ProgressMonitorInputStream
课程进行阅读并显示进度,而无需费心调用setProgress或者听“progress”属性。
如果您想手动执行此操作,请创建SwingWorker加载任务,根据需要调用setProgress,根据需要实例化ProgressMonitor(或JProgressBar),在SwingWorker上注册PropertyChangeListener,检查“进度”更改并更新监控/吧。相应。
注意:重要的是要通过PropertyChangeListener,因为它将模型(任务)与视图(swing进度组件)分离,并遵守EDT使用规则。