GWT JSNI вызывает метод апплета - PullRequest
2 голосов
/ 21 сентября 2011

Я хочу добавить апплет Java на страницу GWT и вызвать некоторые методы апплета. Это возможно в javascript, выполнив:

document.applet_id.someAppletMethod("value");

Однако, когда я пытаюсь реализовать ту же идею, используя встроенную функцию JSNI в GWT, она терпит неудачу. По сути, он не может найти объект апплета. Вот код JSNI:

public native void callStringMethod(String methodName, String arg) /*-{
    var temp = "document." + this.@com.my_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 ( пояснение ). Я не совсем знаю, как закодировать это в выражении eval (), поэтому компилятор заменяет $ doc правильной ссылкой, а также сгенерированный javascript содержит указанное пользователем имя метода и аргумент. Как вы, наверное, знаете, невозможно просто смешать входные переменные Java и Javascript ( пояснение )

Примечание 2: следующий код JavaScript запускается из адресной строки веб-браузера

javascript:document.applet_id.someAppletMethod("asdf")

Таким образом, апплет находится на странице, под объектом документа, и я могу получить к нему доступ из Javascript. Это просто не совсем работает с JSNI.

Примечание 3: Я добавляю фактический тег апплета на панель, подклассифицируя класс HTML GWT. По линиям:

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());
}

Спасибо за любую помощь в получении этой работы.

1 Ответ

3 голосов
/ 22 сентября 2011
  1. Попробуйте добавить mayscript="mayscript" к тегу <applet>.
  2. Может быть наивно - вызывается ли callStringMethod() после добавления апплета на страницу?
  3. ЕстьЕще 2, как минимум, 2 вопроса:
...