GWT JSNI вызывает метод апплета

Я хочу добавить 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: Я добавляю фактический тег апплета на панель, создавая подкласс класса GWT HTML. По линии:

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 ответ

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