Я хочу добавить апплет 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());
}
Спасибо за любую помощь в получении этой работы.