我想将一个 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());
}
感谢您为这项工作提供任何帮助。