Java アプレットを GWT ページに追加し、アプレットのメソッドのいくつかを呼び出したいと考えています。これは、次のようにして JavaScript で可能です。
document.applet_id.someAppletMethod("value");
ただし、GWT で JSNI ネイティブ関数を使用して同じアイデアを実装しようとすると失敗します。基本的に、アプレット オブジェクトを見つけることができません。JSNI コードは次のとおりです。
public native void callStringMethod(String methodName, String arg) /*-{
var temp = "document." + this.@com.my_project.AppletWrapper::appletName + "." + methodName + "(\"" + arg + "\");";
eval(temp); //<----- FAIL
//SOME TEST CODE
$doc.applet_id.someAppletMethod("test value") //<----- FAIL as well
alert(typeof $doc.applet_id); //Undefined
alert(typeof document.applet_id); //Undefined
alert(typeof $wnd.applet_id); //Undefined
}-*/;
注 1: 「ドキュメント」は JSNI から使用できる有効な名前ではないことはわかっています。代わりに $doc を使用します (説明)。これを eval() ステートメントでエンコードする方法がよくわからないため、コンパイラは $doc を適切な参照に置き換えます。また、生成された JavaScript には、ユーザーが指定したメソッド名と引数が含まれます。お気づきかもしれませんが、入力 Java 変数と Javascript を混在させることはできません (説明) 。
注 2: 次の JavaScript は、Web ブラウザーのアドレス バーから実行されます。
javascript:document.applet_id.someAppletMethod("asdf")
したがって、アプレットはページのドキュメント オブジェクトの下にあり、Javascript からアクセスできます。JSNIからはうまく機能していません。
注 3: GWT の HTML クラスをサブクラス化して、実際のアプレット タグをパネルに追加しています。次の行に沿って:
public AppletWrapper(String appletName, String jarName, String className) {
StringBuilder applet = new StringBuilder();
applet.append("<applet archive=\"").append(jarName).append("\" ");
applet.append("code=\"").append(className).append("\" ");
applet.append("name=\"").append(appletName).append("\" ");
applet.append("id=\"").append(appletName).append("\" ");
applet.append("width=\"100%\" height=\"450\">");
applet.append("Browser doesn't support Java");
applet.append("</applet>");
this.setHTML(applet.toString());
}
これを機能させるための助けをありがとう。