我想将Java小程序添加到GWT页面并调用某些小程序的方法。在javascript中,可以这样做:
document.applet_id.someAppletMethod("value");
但是,当我尝试在GWT中使用JSNI本机函数实现相同的想法时,它会失败。基本上,它找不到applet对象。这是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从网络浏览器地址栏中运行
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());
}
感谢您提供的帮助。
最佳答案
尝试将mayscript="mayscript"
添加到<applet>
标记。
也许很幼稚-将小程序添加到页面后调用callStringMethod()
吗?
还有另外2个至少2个其他问题,例如:GWT JSNI: invoking applet methods?和GWT problem with calling Java methods from JSNI