我想将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

10-02 04:11