2010-12-02 11 views
9

Tengo un applet de Java que he escrito y lo he estado ejecutando durante bastante tiempo. En el applet tengo un montón de JLabels que usan HTML en su contenido de texto (lo cual está permitido y ha estado funcionando durante años). La razón principal por la que uso HTML es para permitir saltos de línea en JLabels.HTML ya no funciona en JLabel (y otros componentes)

La edición: Recientemente, los JLabels que tienen HTML en ellos (algunos no) dejaron de mostrar su texto. Creo que podría tener algo que ver con la reciente actualización de Java (Java SE 6 Update 22, en 2010-Oct-12) no 100 por ciento segura, pero los problemas parecían comenzar en ese momento. Tal vez un error ha sido introducido? o característica eliminada?

Intenté con un JEditorPane y parecía tener los mismos problemas cuando el contenido era HTML.

También algo importante a tener en cuenta es que la primera vez que carga el applet (la primera vez que se inicia el tiempo de ejecución java) funciona bien, pero si actualiza la página web tiene los problemas descritos.

¿Alguien tiene problemas similares? Alguien tiene alguna idea? o solo estoy haciendo algo tonto?

me hizo una muy simple applet de prueba y puedo reproducir los problemas con el 100% de regularidad (recordando que la primera vez que se carga en tiempo de ejecución que va a funcionar, sólo refresca sucesivas finos hará que los temas):

[HelloWorldApplet .java]

import javax.swing.*; 

public class HelloWorldApplet extends JApplet 
{ 
    public void init() 
    { 
     this.add(new JLabel("Hello Everybody (Text)"), java.awt.BorderLayout.NORTH); 
     this.add(new JLabel("<html><body>Hello Everybody (HTML)</body></html>"), java.awt.BorderLayout.SOUTH); 
    } 
} 

[HellowWorldApplet.html]

<html> 
<title>A Test</title> 
<body> 
    <applet code="HelloWorldApplet.class" width="320" height="120"> 
     You need Java 
    </applet> 
</body> 
</html> 

PS. He estado probando principalmente con Chrome, pero también lo intenté brevemente en IE 8. También (obviamente) tengo la última actualización de Java SE 6 22 instalada como mi tiempo de ejecución, y tengo la actualización correspondiente para mi JDK. Recopilo el applet de prueba anterior usando simplemente: "javac HelloWorldApplet.java"

+0

que acabo de hacer otra prueba en la que generar un nuevo subproceso cuales bucles y actualiza las etiquetas cada segundo, mostrando un recuento int creciente. Cuando el int es par, actualizo la etiqueta con HTML y cuando int es impar, actualizo la etiqueta con Text (Sin HTML) ... como esperaba al actualizar con HTML, la etiqueta no muestra nada, y cuando se actualiza con solo Text, se muestra el texto correctamente Algo está mal con HTML. Parece difícil de creer que nadie más tenga estos problemas. – devlop

+0

También llamar a .putClientProperty ("html.disable", Boolean.TRUE) en la etiqueta hará que se muestre el html (pero, por supuesto, se mostrará como texto, es decir, mostrará el html en lugar de interpretarlo, que no es lo que es deseado). Pero solo otra prueba de que JLabel está dibujando correctamente, simplemente no está interpretando el html. – devlop

Respuesta

7

Wasted una tarde en busca de la causa de esto, ver el siguiente informe de error http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6993691

La solución en el informe de error es:

import javax.swing.*; 
import javax.swing.text.html.parser.ParserDelegator; 

public class HelloWorldApplet extends JApplet { 
    public void init() { 
     ParserDelegator workaround = new ParserDelegator(); 
     applet.add(new JLabel("Hello Everybody (Text)"), java.awt.BorderLayout.NORTH); 
     applet.add(new JLabel("<html>Hello Everybody (HTML)</html>"), java.awt.BorderLayout.SOUTH); 
    } 
} 
+0

Aww sí! Muchas gracias, siento que hayas pasado la tarde hablando de esto, pero estoy muy agradecido. Intenté buscar en la base de datos de errores pero no encontré esa. Al menos era un error y no me estaba volviendo loco. Gracias de nuevo, yay. – devlop

+0

de hecho debo agradecer :) me encontré con este comportamiento al extender un applet antiguo (principalmente basado en AWT), había estado pensando lo que había estropeado la codificación. afortunadamente encontré tu publicación unas horas más tarde y luego otra en stackoverflow vinculándome con el rastreador de errores de Java ... – kolmis

+1

Muchas gracias. Usted guardó mi applet. :PAG – gd1

0

Sonidos de la descripción como un problema de enhebrado.

Lamentablemente, los applets no se construyen ni tienen sus métodos de ciclo de vida llamados en AWT Event Dispatch Thread (EDT).

Técnicamente su constructor y el código init deben ejecutarse dentro de java.awt.EventQueue.invokeAndWait.

+0

He simplificado el ejemplo anterior (del original), solo por simplicidad. Luego, en respuesta a su respuesta, intenté envolver las dos llamadas a this.add() con una llamada invokeAndWait (nueva Runnable() {public void run() {...}}) y todavía tiene los mismos problemas. – devlop

+0

También me parece gracioso que todo funcione bien con un tiempo de ejecución nuevo, pero luego el problema ocurre en sucesivas ejecuciones dentro del tiempo de ejecución en ejecución. Pensaría que un problema de enhebrado siempre ocurriría, aunque podría ser incorrecto al respecto. – devlop

+0

@devlop Enhebrar es sobre el tiempo. La inicialización inicial puede ser lenta, por lo que hay un amplio margen para que los tiempos sean completamente diferentes. –

Cuestiones relacionadas