2010-03-22 15 views
6

Tengo problemas para obtener un Applet de Java que se comunique con el código de Javascript en la página en la que se aloja el applet. Funciona a veces, pero a veces arroja una excepción oscura, que Google no ha encontrado ninguna información útil, además de algunos informes de errores de Java que nunca se resolvieron (gracias Sun).Problema con Java Applet <--> Comunicación de Javascript

Aquí está el código que estoy utilizando:

JSObject win = JSObject.getWindow(this); 
Object[] args = new Object[1]; 
args[0] = "test argument"; 
String result = (String) win.call("testJSfunc", args); // XXX 

Aquí es la excepción consigo en la línea marcada // XXX. Tenga en cuenta que es intermitente. A menudo funciona, pero a veces no funciona, usando el mismo código exacto. Volver a cargar la página repetidamente producirá el error bastante rápido.

netscape.javascript.JSException: No registered plugin for applet ID 1 
    at sun.plugin2.main.client.MessagePassingJSObject.newJSException(Unknown Source) 
    at sun.plugin2.main.client.MessagePassingJSObject.waitForReply(Unknown Source) 
    at sun.plugin2.main.client.MessagePassingJSObject.call(Unknown Source) 
    at TestApplet.testCallJS(TestApplet.java:159) 
    at TestApplet.init(TestApplet.java:139) 
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

¿Existe alguna otra forma más estable de comunicación entre Java y Javascript que debería estar utilizando?

--- --- Más información

estoy usando el guión deployJava.js lo dispuesto por Sun para incrustar el applet sobre la marcha. Me aseguré de que MAYSCRIPT esté habilitado. Sé que no es un problema con MAYSCRIPT, porque la comunicación funciona algunas veces.

+0

¿Está usando la etiqueta de applet para incrustarlo? – Enrique

Respuesta

1

Creo que he resuelto el problema mediante el establecimiento de classloader_cache=false y separate_jvm=true ... una vez me puse ambas cosas, los errores intermitentes oscuros dejaron sucediendo. Espero que esto resuelva el problema para siempre.

+0

Desafortunadamente, esta aplicación de solución es totalmente apátrida. Todas las variables estáticas se borran después de volver a cargar o actualizar la página. –

1

Asegúrese de tener MAYSCRIPT en la etiqueta de su applet.

<applet id="..." code="..." name=".." codebase="..." archive="..." width="100%" height="100%" MAYSCRIPT> 
+0

Sí, está allí. MAYSCRIPT no debería ser el problema de todos modos, porque la excepción es intermitente. Algunas veces funciona, otras veces no (simplemente recargando la página, sin cambiar ningún código). Si MAYSCRIPT fuera el problema, bloquearía la comunicación el 100% del tiempo. – davr

+0

Creo que MAYSCRIPT se ignora en PlugIn2. Nunca funcionó en todos los navegadores correctamente de todos modos. –

+0

'plugin2' en Google, interesante, me pregunto si la arquitectura de su nuevo complemento introducido en Java 1.6.10 tiene algunos errores. – davr

0

Si establece separate_jvm en true, esto tiene un efecto muy negativo en el rendimiento ya que se crea una nueva instancia de Java VM para cada applet. Si tiene varios applets en la página (más de 30), esto es bastante lento.

Me pregunto si existe alguna otra solución para este problema. Por ejemplo, tenemos múltiples applets en varias pestañas. Cuando se abre la primera pestaña con applets, todos los applets se muestran correctamente sin problemas. Sin embargo, cambie a cualquier otro resultado de pestaña con el error de ningún complemento registrado. En IE, este error no ocurre porque en IE todos los applets se instancian de inmediato ya que se agregan a DOM.