显示自定义的加载进度指示器

Java applet 可以显示自定义的加载进度指示器,该指示器显示 applet 资源以及其他 applet 特定数据的下载进度。

考虑一下 Weather applet 和CustomProgress类,以了解如何为 Java applet 实现自定义的加载进度指示器。为了演示 Long 时间的大量下载,此 Servlets 的 JAR 文件已被人为夸大,而customprogress_applet.jnlp文件将其他 JAR 文件指定为资源。

开发自定义的加载进度指示器

要为您的 applet 开发自定义的加载进度指示器,请创建一个实现DownloadServiceListenerinterface的类。

加载进度指示器类的构造函数将根据 UI 的显示方式和类所需的功能而有所不同。应遵循以下准则:

  • 要在单独的顶层窗口中显示加载进度指示器,请创建一个没有任何参数的构造函数。

  • 要在 Servlets 的容器中显示 Servlets 的加载进度指示器,请创建一个以Object作为参数的构造函数。可以将Object参数类型转换为java.awt.Container类的实例。

  • 如果加载进度指示器类需要访问 applet 的参数,则创建两个构造函数,如下所示:

  • 如前所述,创建一个以Object作为参数的构造函数。

    • 创建一个接受两个类型为Object的参数的构造函数。第一个参数可以类型转换为java.awt.Container类的实例,第二个参数可以类型转换为java.applet.AppletStub类的实例。

Java 插件软件将根据 Client 端计算机上 JRE 软件的功能来调用适当的构造函数。

import javax.jnlp.DownloadServiceListener;
import java.awt.Container;
import java.applet.AppletStub;
import netscape.javascript.*;

// ...

public class CustomProgress implements DownloadServiceListener {   
    Container surfaceContainer = null;
    AppletStub appletStub = null;
    JProgressBar progressBar = null;
    JLabel statusLabel = null;
    boolean uiCreated = false;

    public CustomProgress(Object surface) {
       init(surface, null);
    }

    public CustomProgress(Object surface, Object stub) {
        init(surface, stub);
    }

    public void init(Object surface, Object stub) {
        try {
            surfaceContainer = (Container) surface;
            appletStub = (AppletStub) stub;
        } catch (ClassCastException cce) {
            // ...
        }
    }
// ...
}

以下代码段显示了如何为加载进度指示器构建 UI。使用java.applet.AppletStub类的实例检索 applet 的参数。调用JSObject.getWindow(null)方法以获得对 Servlets 的父网页的引用,并在该页面上调用 JavaScript 代码。

private void create() {
    JPanel top = createComponents();
    if (surfaceContainer != null) {
        // lay out loading progress UI in the given
        // Container
        surfaceContainer.add(top, BorderLayout.NORTH);
        surfaceContainer.invalidate();
        surfaceContainer.validate();
    }     
}
private JPanel createComponents() {
    JPanel top = new JPanel();
    // ...
    // get applet parameter using an instance of the
    // AppletStub class "tagLine" parameter specified
    // in applet's JNLP file
    String tagLine = "";
    if (appletStub != null) {
        tagLine = appletStub.getParameter("tagLine");
    }
    String lblText = "<html><font color=red size=+2>JDK
        Documentation</font>
" + tagLine + "
</html>"; JLabel lbl = new JLabel(lblText); top.add(lbl, BorderLayout.NORTH); // use JSObject.getWindow(null) method to retrieve // a reference to the web page and make JavaScript // calls. Duke logo displayed if displayLogo variable // set to "true" in the web page String displayLogo = "false"; JSObject window = JSObject.getWindow(null); if (window != null) { displayLogo = (String)window.getMember("displayLogo"); } if (displayLogo.equals("true")) { lbl = new JLabel(); ImageIcon logo = createImageIcon("images/DukeWave.gif", "logo"); lbl.setIcon(logo); top.add(lbl, BorderLayout.EAST); } statusLabel = new JLabel( "html><font color=green size=-2>" + "Loading applet...</font></html>"); top.add(statusLabel, BorderLayout.CENTER); // progress bar displays progress progressBar = new JProgressBar(0, 100); progressBar.setValue(0); progressBar.setStringPainted(true); top.add(progressBar, BorderLayout.SOUTH); return top; }

基于overallPercent参数,通过以下方法创建和更新进度指示器。 Java 插件软件会定期调用这些方法,以传达 Servlets 的下载进度。当资源的下载和验证完成 100%时,Java 插件软件将始终发送消息。

public void progress(URL url, String version,
                     long readSoFar, long total,
                     int overallPercent) {        
    // check progress of download and update display
    updateProgressUI(overallPercent);
}

public void upgradingArchive(java.net.URL url,
                  java.lang.String version,
                  int patchPercent,
                  int overallPercent) {
    updateProgressUI(overallPercent);
}

public void validating(java.net.URL url,
            java.lang.String version,
            long entry,
            long total,
            int overallPercent) {
    updateProgressUI(overallPercent);
}

private void updateProgressUI(int overallPercent) {
    if (!uiCreated && overallPercent > 0
        && overallPercent < 100) {
        // create custom progress indicator's
        // UI only if there is more work to do,
        // meaning overallPercent > 0 and
        // < 100 this prevents flashing when
        // RIA is loaded from cache
        create(); 
        uiCreated = true;            
    }
    if (uiCreated) {
        progressBar.setValue(overallPercent);
    }
}

编译加载进度指示器类,并使用显示加载进度指示器所需的所有资源构建一个 JAR 文件。在您的classpath中包括以下 JAR 文件以启用编译:

  • <your JRE directory>/lib/javaws.jar

  • <your JRE directory>/lib/plugin.jar –仅当您的加载进度指示器类使用JSObject.getWindow方法来调用 applet 父级网页中的 JavaScript 代码时,才需要此 JAR 文件。

现在可以使用加载进度指示器类。下一步是将这个加载进度指示器 JAR 文件指定为 Servlets 的加载进度指示器。

为 Servlets 指定加载进度指示器

要为 Servlets 指定定制的加载进度指示器,请在 Servlets 的 JNLP 文件中包括以下信息:

  • 具有download="progress"属性的jar标签

  • progress-class属性,带有加载进度类的完全限定名称。

customprogress_applet.jnlp文件中的以下代码片段显示了download="progress"progress-class属性的用法。

<jnlp spec="1.0+"
  codebase="https://docs.oracle.com/javase/tutorial/deployment"
  href="">
  <!-- ... -->
  <resources>
    <!-- ... -->
    <jar
      href="applet/examples/dist/applet_AppletWithCustomProgressIndicator"
      main="true" />    
    <jar
      href="applet/examples/dist/applet_CustomProgressIndicator/applet_CustomProgressIndicator.jar" 
     download="progress" />
  </resources>
  <applet-desc
     name="customprogressindicatordemo.WeatherApplet"
     main-class="customprogressindicatordemo.WeatherApplet"
     progress-class="customprogressindicator.CustomProgress"
     width="600"
     height="200">
     <param
       name="tagLine"
       value="Information straight from the horse's mouth!"/>
  </applet-desc>
<!-- ... -->
</jnlp>

将 Servlets 部署在网页中。在网络浏览器中打开AppletPage.html,以查看“天气”Servlets 的加载进度指示器。

Note:

要正确查看示例,您至少需要安装Java SE 开发套件(JDK)6 更新 21版本。

Note:

如果您以前查看过该 Servlets,请在再次查看该 Servlets 之前,使用 Java 控制面板清除缓存。您将看不到先前缓存的 applet 的进度指示器。

Note:

如果看不到示例正在运行,则可能需要在浏览器中启用 JavaScript 解释器,以便 Deployment Toolkit 脚本能够正常运行。

将“加载进度指示器”与 Applet UI 集成

您也可以将加载进度指示器集成到 Servlets 的 UI 中。在网络浏览器中打开AppletPage.html,以查看集成到 Weather applet UI 中的加载进度指示器。查看IntegratedProgressIndicator.java类和嵌入式 注解 以获取更多信息。

下载以下示例的源代码,以进一步进行实验:

有关自定义富 Internet 应用程序(RIA)加载体验的详细信息,请参见自定义加载体验主题。