显示自定义的加载进度指示器
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)加载体验的详细信息,请参见自定义加载体验主题。