用于下载过程的Java Swing进度条

时间:2012-08-13 16:28:31

标签: java swing backend frontend jprogressbar

我正在使用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值,具体取决于下载进度?

1 个答案:

答案 0 :(得分:7)

如果你想在摇摆中做MVC,可以想到SwingWorker课程 SwingWorker附带了一个名为“progress”的属性,您可以使用PropertyChangeListener收听。

可以使用setProgress(int 0-100)方法从swingworker中触发进度事件。所以这里是用于在后台加载具有进度概念的文件(请注意,您需要知道文件的大小才能计算进度百分比)。

显示进度可以使用两个选项完成:JProgressBar表示完全控制,或ProgressMonitor表示几乎自我管理的弹出窗口,其中包含进度条。请参阅tutorial以查看差异。

解决方案1 ​​

正如他们所说,如果您选择ProgressMonitor并且您的后台任务正在从InputStream读取,则您可以使用ProgressMonitorInputStream课程进行阅读并显示进度,而无需费心调用setProgress或者听“progress”属性。

解决方案2

如果您想手动执行此操作,请创建SwingWorker加载任务,根据需要调用setProgress,根据需要实例化ProgressMonitor(或JProgressBar),在SwingWorker上注册PropertyChangeListener,检查“进度”更改并更新监控/吧。相应。

注意:重要的是要通过PropertyChangeListener,因为它将模型(任务)与视图(swing进度组件)分离,并遵守EDT使用规则。