我想将一个Java applet添加到GWT页面并调用一些applet的方法。这可以在javascript中执行:
document.applet_id.someAppletMethod("value");
然而,当我尝试在GWT中使用JSNI本机函数实现相同的想法时,它失败了。基本上它找不到applet对象。这是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:我知道“document”不是JSNI使用的有效名称,而是使用$ doc(explanation)。我不太清楚如何在eval()语句中对此进行编码,因此编译器用适当的引用替换$ doc,并且生成的javascript包含用户指定的方法名称和参数。您可能知道不可能只混合输入Java变量和Javascript(explanation)
注意2:以下JavaScript从Web浏览器地址栏
运行javascript:document.applet_id.someAppletMethod("asdf")
所以applet就在页面上,在文档对象下,我可以从Javascript访问它。它只是从JSNI开始工作。
注3:我通过继承GWT的HTML类将实际的applet标签添加到面板中。沿着:
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());
}
感谢您提供有关此工作的任何帮助。
答案 0 :(得分:3)
mayscript="mayscript"
添加到<applet>
代码。callStringMethod()
?