2011-09-21 52 views
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()); 
} 

感谢您的任何帮助,让这项工作。

回答

3
  1. 尝试将mayscript="mayscript"添加到<applet>标记。
  2. 也许天真 - 是在将小程序添加到页面后调用的callStringMethod()
  3. 还有2点至少2等类似这样的问题:GWT JSNI: invoking applet methods?GWT problem with calling Java methods from JSNI
+0

我见过的其他问题,但我不使用