Java のアプレットは先読みできるか
飽きずにこの系のネタです。
JavaScript で画像 ( <img> ) を先読みするように、Applet を先読みできるかを実験してみます。
もしも先読みが出来れば、アプレットがまだキャッシュされていない状況(初めて使うアプレット)でも、ちょっとしたトリックでユーザーの「待たされている感」をなくすことが出来るかも。
試してみる
使うアプレットのソースはこれです。
SimpleApplet.java
package fooami; import javax.swing.JApplet; import javax.swing.JLabel; public class SimpleApplet extends JApplet { static { System.out.println("static initializer"); } public SimpleApplet() { getContentPane().add(new JLabel("これはアプレットです。")); } @Override public void destroy() { super.destroy(); System.out.println("destroy"); } @Override public void init() { super.init(); System.out.println("init"); } @Override public void start() { super.start(); System.out.println("start"); } @Override public void stop() { super.stop(); System.out.println("stop"); } }
HTML はこれ。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script> var applet = document.createElement("applet"); applet.archive = "SimpleApplet.jar"; applet.code = "fooami.SimpleApplet"; applet.width = "200"; applet.height = "100"; function showApp() { var div = document.getElementById("pane"); div.replaceChild(applet, div.firstChild); } </script> </head> <body> <h1>アプレットが背後で先読みされるかどうかの実験です。</h1> <hr> <div id="pane"><a id="btn" href="#" onclick="showApp()">ここほれ。</a></div> </body> </html>
document.createElement() で applet の DOM オブジェクトを作成して属性を設定しておきます。
HTML の表示完了後に「ここほれ。」をクリックすると、先読みしておいたアプレットに置き換わるかもという仕組みです。
今回用意したデモ用のアプレットではサイズが小さいので先読みされてもされなくても、体感的に違いが分り難いかもしれませんので、先読みができたかどうかは Java コンソールが起動されるかどうか、そしてクラスがロードされればコンソールに「static initializer」と出力されるはずです。
では試してみます。先読みデモページ
出来ませんね。期待した人ゴメンナサイ(^^;
Wireshark でパケットをキャプチャしてみると、「ここほれ。」をクリックしたときに「SimpleApplet.jar」を取りにいってます。
残念。
では代替案
代わりにこんな HTML で。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script> function showApp() { var div = document.getElementById("pane"); var app = document.getElementById("app"); app.width = "200"; app.height = "100"; app.style.visibility="visible"; div.removeChild(div.firstChild); } </script> </head> <body> <h1>アプレット先読みの代替案です。</h1> <hr> <div id="pane"><a id="btn" href="#" onclick="showApp()">ここほれ。</a> <applet id="app" archive="SimpleApplet1.jar" code="fooami.SimpleApplet" width="1" height="1" style="visibility:hidden;"></applet> </div> </body> </html>
つまりアプレットを1ピクセルに設定且つ非表示にしておいて、「ここほれ。」がクリックされたら表示するというパターンです。
因みに JAR ファイルの名前が変わっていますが内容は同じです。クラスローダーのインスタンスを変えさせるために名前だけ変えてます。
では試してみます。代替案のデモページ
これならうまくいきます。
因みに visibility でなく display だと駄目でした。値を none から block に切り替えたときに初めて JAR ファイルを取りにいきます。
そんな訳で結論
画像と同じ方法ではないけれど似たようなことは実現できることがわかりました。なので工夫してユーザーの注意を別のところに逸らしておいて適切なタイミングでアプレットを表示することで、あたかも
高速にロードされたかのようにみせることが出来る。
かも知れませんですね。はい。