2011-09-21 97 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

我見過的其他問題,但我不使用