【发布时间】:2012-08-13 16:28:30
【问题描述】:
我正在使用 Java 函数从 Internet 下载文件。
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 :)
}
我的JPanel 中有JProgressBar 组件,它应该可以可视化下载进度:
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() 位于类MyFramework 中的包framework 中。
与Swing 接口生成相关的所有内容,包括事件侦听器,都在包frontend 中。
在Controller 主类中,我创建了MyFramework 的一个实例和ApplicationFrontend 的一个实例,这是frontend 包的主类。
问题是如何根据下载进度更新progressBar 值?
【问题讨论】:
-
您可以通过使用诸如添加到正在下载的 SwingWorker 的 PropertyChangeListener 之类的侦听器来做到这一点。
-
@HovercraftFullOfEels 谢谢,我会用谷歌搜索它。
-
考虑使用ProgressMonitorInputStream 来帮助您。
标签: java swing backend frontend jprogressbar