2
我想添加一个Java小程序到GWT页面并调用一些小程序的方法。这是在JavaScript可能这样做:GWT JSNI调用小程序方法
document.applet_id.someAppletMethod("value");
然而,当我尝试使用JSNI原生功能GWT它未能实现同样的想法。基本上它找不到小程序对象。这里的JSNI代码:
public native void callStringMethod(String methodName, String arg) /*-{
var temp = "document." + [email protected]_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代替(explanation)。我不太清楚如何在eval()语句中编码,以便编译器用适当的引用替换$ doc,并且生成的javascript包含用户指定的方法名称和参数。正如你可能知道这是不可能的,只是混合输入的Java变量和Javascript(explanation)
注2:下面的JavaScript从web浏览器地址栏
javascript:document.applet_id.someAppletMethod("asdf")
运行,这样的小应用程序有没有在页面上,在文档对象下,我可以从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());
}
感谢您的任何帮助,让这项工作。
我见过的其他问题,但我不使用