PRB: Explorador se bloquea al llamar a dispose() en el objeto FileDialog de AWTModal

SÍNTOMAS

Si se llama a la función dispose en un objeto FileDialog de Java en Windows XP, el navegador puede dejar de responder (se bloquea) en momentos aleatorios. Por ejemplo, suponga que crear un subprograma de Java simple con un botón que abre un cuadro de diálogo al hacer clic en él. Si hace clic repetidamente en el botón para abrir el cuadro de diálogo de archivo y, a continuación, haga clic en Cancelar para cerrar el cuadro de diálogo de archivo , el explorador puede bloquearse.

CAUSA

Este problema se produce si el subproceso actual que se inicia el cuadro de diálogo de archivo es el subproceso de envío de eventos.

SOLUCIÓN

Crear un nuevo subproceso para mostrar el cuadro de diálogo de archivo . No utilice el subproceso de envío de eventos predeterminado para mostrar el cuadro de diálogo de archivo . Consulte la parte de "Pasos para resolver el problema" de la sección "Más información" para obtener detalles de implementación.

MÁS INFORMACIÓN

Pasos para reproducir el comportamiento

  1. Crear la clase de java AWTApplet.java como sigue:

    import java.applet.Applet;import java.awt.*;import java.awt.event.*;public class AWTApplet extends Applet implements ActionListener{Button button   = new Button("Call FileDialog");public void init(){// a button panelPanel bpanel = new Panel();bpanel.add(button);GridLayout gridLayout = new GridLayout();this.setLayout(gridLayout);this.add(bpanel);// Add the ActionListener.button.addActionListener(this);}public void actionPerformed(ActionEvent ae){FileDialog dlgFile;dlgFile = new FileDialog((Frame)getParent(),"test");dlgFile.show();// The following call to the dispose function causes the browser to hang.dlgFile.dispose();}}
    Este código genera un subproceso nuevo para abrir el cuadro de diálogo de archivo .
  2. Para compilar la clase java, escriba jvc awtapplet.java en la línea de comandos.
  3. Puede ejecutar el código anterior si procede de una fuente de confianza. Para tener acceso a los archivos desde el cuadro de diálogo de archivo , Java se extrae el recinto de seguridad de Java. (El recinto de seguridad de Java es el esquema de seguridad para los programas de Java). Puede tener acceso a archivos con Java si coloca los archivos de clase en un archivo .cab firmado, que se indica en la sección "Referencias".

    Los siguientes comandos utilizan herramientas de Software Development Kit (SDK) de Microsoft para Java para compilar el archivo de origen Java y generar un archivo .cab firmado que utiliza el certificado de prueba de Microsoft:
    jvc awtapplet.java
    cabarc n myapplet.cab awtapplet.class
    setreg 1 true
    makecert -sk mytestkey - n "cn = mytestkey" mytestkey.cer
    cert2spc mytestkey.cer mytestkey.spc
    signcode -j javasign.dll -jp - spc baja mytestkey.spc -k mytestkey
    myapplet.cab
    ChkJava myapplet.cab
  4. Crear un archivo de lenguaje de marcado de hipertexto (HTML) que aparece como sigue:
    <APPLET CODE = "AWTApplet.class" HEIGHT = 100 WIDTH  = 100>  <PARAM NAME="cabbase" VALUE="MyApplet.cab"></APPLET>
  5. Cargue la página HTML en un explorador Web, haga clic en Llamar FileDialogy, a continuación, haga clic en Cancelar en el cuadro de diálogo de archivo .
  6. Repita el paso cinco hasta los bloqueos del explorador.

Pasos para resolver el problema

  1. Implementar la clase AWTApplet de la siguiente manera:
    import java.applet.Applet;import java.awt.*;import java.awt.event.*;public class AWTApplet extends Applet implements ActionListener, Runnable{Button button   = new Button("Call FileDialog");public void init(){// a button panelPanel bpanel = new Panel();bpanel.add(button);GridLayout gridLayout = new GridLayout();this.setLayout(gridLayout);this.add(bpanel);// Add the ActionListener.button.addActionListener(this);}public void actionPerformed(ActionEvent ae){new Thread(this).start();}public void run(){FileDialog dlgFile;dlgFile = new FileDialog((Frame)getParent(),"test");dlgFile.show();dlgFile.dispose();}}
    Este código genera un subproceso nuevo para abrir el cuadro de diálogo de archivo .

  2. Repita los pasos 2 a 5 de la sección "Pasos para reproducir comportamiento".

REFERENCIAS

Para obtener información adicional, haga clic en los números de artículo siguientes
Para ver los artículos en Microsoft Knowledge Base:

193877 HOWTO: hacer que el código Java de confianza en Internet Explorer
¿179543 HOWTO: cómo se puede habilitar certificados de prueba en un equipo cliente?
Propiedades

Id. de artículo: 318175 - Última revisión: 15 feb. 2017 - Revisión: 1

Comentarios