【问题标题】:Java Swing progress bar for download process用于下载过程的 Java Swing 进度条
【发布时间】: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


【解决方案1】:

当您想在 Swing 中执行 MVC 时,会想到 SwingWorker 类。
SwingWorker 带有一个名为“progress”的属性,您可以使用PropertyChangeListener 收听该属性。

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

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

解决方案 1

正如他们所说,如果您选择 ProgressMonitor 并且您的后台任务是从 InputStream 读取,您可以使用 ProgressMonitorInputStream 类来执行读取和显示进度,而无需调用 setProgress 或收听“进度”属性。

解决方案 2

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

注意:通过 PropertyChangeListener 很重要,因为它将模型(任务)与视图(摆动进度组件)解耦并遵守 EDT 使用规则。

【讨论】:

  • 请注意,在解决方案 1 中,您仍应使用 SwingWorker,只是它会实例化 ProgressMonitorInputStream 而不是调用 setProgress...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2016-08-27
  • 2013-10-17
相关资源
最近更新 更多