2011-05-18 13 views
7

He creado un applet que abre un JFileChooser para seleccionar un archivo con el clic de JButton. Funciona bien cuando lo ejecuto en Eclipse. Cuando lo incrusto en una página HTML con la etiqueta del applet, no ocurre nada cuando hago clic en el botón.Depuración applet de Java en el navegador: funciona en Eclipse pero no en el navegador

Cualquier sugerencia de por qué el JFileChooser no se abre en el navegador sería apreciado, pero mi pregunta principal es ¿cómo puedo depurar esto? No he podido encontrar nada en Google sobre cómo agregar una consola Java a Firefox 3.6 o Chrome. ¿Hay alguna manera de obtener algún tipo de información sobre por qué el JFileChooser no se abre?

Depuración contestadas en comentarios a continuación

Así la consola dice que no es una excepción negado el acceso, lo que supongo es porque no he "firmado" el applet. ¿Cuál debería ser el proceso de desarrollo en lo que respecta a la firma de un applet? ¿Tengo que firmarlo con un certificado emitido por una CA válida antes de poder probarlo en un navegador, o hay alguna cosa simple que pueda hacer mientras la prueba?

Aquí está mi código:

package com.putapplet; 

import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.InputStreamReader; 
import java.net.URL; 

import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.SwingUtilities; 


@SuppressWarnings("serial") 
public class PutToS3Applet extends JApplet { 

    private static long maxFileSizeInBytes = 1048576; 

    private static String listenerUrl = "xxx"; 
    private String listenerQueryString; 

    private String signedPutUrl; 

    private JProgressBar progressBar; 
    private JButton button; 
    private JLabel messageField; 

    public void init() { 

     setMaxFilesize(1); 

     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 
       public void run() {      
        createGUI(); 
       } 
      }); 
     } catch (Exception e) { 
      System.err.println("createGUI didn't complete successfully"); 
     }  
    } 

    private void createGUI() { 

     button = new JButton("Choose File..."); 
     button.addActionListener(new ButtonListener()); 

     progressBar = new JProgressBar(0, 100); 
     progressBar.setStringPainted(true); 

     messageField = new JLabel(); 
     //messageField.setPreferredSize(new Dimension(300, 20)); 

     FlowLayout layout = new FlowLayout(); 
     layout.setAlignment(FlowLayout.LEFT); 

     JPanel topPanel = new JPanel(); 
     topPanel.setLayout(layout); 

     JPanel bottomPanel = new JPanel(); 
     bottomPanel.setLayout(layout); 

     topPanel.add(button); 
     topPanel.add(progressBar); 
     bottomPanel.add(messageField); 

     setLayout(new GridLayout(2,1)); 
     add(topPanel); 
     add(bottomPanel); 

    } 

    class ButtonListener implements ActionListener { 
     public void actionPerformed(ActionEvent ae) { 
      JFileChooser fileChooser = new JFileChooser(); 
      int showOpenDialog = fileChooser.showDialog(null, "Upload File"); 
      if (showOpenDialog != JFileChooser.APPROVE_OPTION) return; 

      final File fileToUpload = fileChooser.getSelectedFile(); 

      if (fileToUpload.length() > PutToS3Applet.maxFileSizeInBytes) { 
       messageField.setText("Your file must be smaller than " + getHumanReadableMaxFilesize()); 
       return; 
      } 

      listenerQueryString = "query[filename]=" + fileToUpload.getName(); 

      //get signed PUT url for s3 
      try { 

       URL listener = new URL(listenerUrl + listenerQueryString); 
       BufferedReader in = new BufferedReader(new InputStreamReader(listener.openStream())); 
       signedPutUrl = in.readLine().replace("http://", "https://"); 
       messageField.setText(signedPutUrl); 

      } catch (Exception e) {    
       messageField.setText("Oops, there was a problem connecting to the server. Please try again."); 
       e.printStackTrace(); 
      } 
     } 
    } 

    private String getHumanReadableMaxFilesize() { 
     return Long.toString((PutToS3Applet.maxFileSizeInBytes/1024/1024)) + "MB"; 
    } 

    private void setMaxFilesize(int sizeInMegaBytes) { 
     PutToS3Applet.maxFileSizeInBytes = PutToS3Applet.maxFileSizeInBytes * sizeInMegaBytes; 
    } 
} 

Aquí es la excepción:

Exception in thread "AWT-EventQueue-1" java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read) 
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374) 
at java.security.AccessController.checkPermission(AccessController.java:546) 
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285) 
at java.lang.System.getProperty(System.java:650) 
at javax.swing.filechooser.FileSystemView.getHomeDirectory(FileSystemView.java:393) 
at javax.swing.plaf.metal.MetalFileChooserUI.installComponents(MetalFileChooserUI.java:253) 
at javax.swing.plaf.basic.BasicFileChooserUI.installUI(BasicFileChooserUI.java:136) 
at javax.swing.plaf.metal.MetalFileChooserUI.installUI(MetalFileChooserUI.java:126) 
at javax.swing.JComponent.setUI(JComponent.java:662) 
at javax.swing.JFileChooser.updateUI(JFileChooser.java:1763) 
at javax.swing.JFileChooser.setup(JFileChooser.java:360) 
at javax.swing.JFileChooser.<init>(JFileChooser.java:333) 
at javax.swing.JFileChooser.<init>(JFileChooser.java:286) 
at com.putapplet.PutToS3Applet$ButtonListener.actionPerformed(PutToS3Applet.java:82) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
at java.awt.Component.processMouseEvent(Component.java:6289) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) 
at java.awt.Component.processEvent(Component.java:6054) 
at java.awt.Container.processEvent(Container.java:2041) 
at java.awt.Component.dispatchEventImpl(Component.java:4652) 
at java.awt.Container.dispatchEventImpl(Container.java:2099) 
at java.awt.Component.dispatchEvent(Component.java:4482) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) 
at java.awt.Container.dispatchEventImpl(Container.java:2085) 
at java.awt.Component.dispatchEvent(Component.java:4482) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644) 
at java.awt.EventQueue.access$000(EventQueue.java:85) 
at java.awt.EventQueue$1.run(EventQueue.java:603) 
at java.awt.EventQueue$1.run(EventQueue.java:601) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
at java.awt.EventQueue$2.run(EventQueue.java:617) 
at java.awt.EventQueue$2.run(EventQueue.java:615) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:614) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+0

Siéntase libre de agregar algún código si desea alguna información sobre por qué su código no funciona aquí ... – Kyle

+0

Encontré la respuesta a cómo depurar, al menos en Ubuntu: Ejecute el comando jcontrol . En la pestaña Avanzado, expanda la consola de Java y seleccione Mostrar consola. Esto hará que la consola de Java se abra siempre que se ejecute un applet en su navegador –

+0

Quizás tenga el mismo problema: http://stackoverflow.com/questions/17786669/java-1-7-0-u25-applet-debugging- no parece con Eclipse/17941467 # 17941467 – Oli

Respuesta

1

Considere que permite la consola de Java que permitirá ver todas las trazas de la pila de excepción esperanza de hacer más fácil para usted depurar.

También "appletviewer" está diseñado para probar applets fuera de un navegador, lo que le permite ver las excepciones.

1

Es muy probable que su SecurityManager no lo permita.

En FireFox, puede verificar la consola java yendo a Herramientas> Consola Java. Firefox ya debería tenerlo configurado.

0

Implementar una solución de registro (como Log4j) es otra opción que podría valer la pena mirar. Algunos tutorials rápido sobre cómo poner esto en funcionamiento.

11

Solo una nota al margen. Es bastante fácil para los applets remotos de depuración.

Configure el complemento de Java para permitir la depuración remota. Lo haces de diferentes maneras en diferentes plataformas, pero será algo así en Windows. Inicie el panel de control, seleccione java. Clic alrededor hasta que encuentre opciones de VM, y agregar estos argumentos de VM:

-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=6789,suspend=n 

6789 será el puerto de depuración.

Iniciar la depuración remota en Eclipse se hace haciendo algo similar a. Configuraciones de depuración, Aplicación Java remota, Crear una nueva configuración. Seleccione Standard (Socket Attach) como tipo de conexión e ingrese locahost como dirección y 6789 como puerto.

+0

1 para la depuración remota – Kyle

+1

Esta trabajar para mí en Java 1.7 actualización 51. – mjaggard

+0

para configurar el plugin de Java para permitir la depuración remota en Mac OS X (por ejemplo, para Safari): Preferencias del sistema> Java (se abre el "Panel de control de Java"). Pestaña "Java"> Ver ... (se abre la ventana "Configuración del entorno de ejecución de Java") En la tabla, encuentre la línea correcta, haga clic en "Parámetros de tiempo de ejecución" campo y agregue los argumentos de VM dados arriba. –

0

cuando incrusta el applet en la página HTML que tiene que firmar el archivo jar subprograma Consulte la documentación oracle docs

crear su certificado a continuación, utilizar entonces en símbolo del sistema escriba el siguiente comando

jarsigner jarfilename.jar yourcertificatename 
Cuestiones relacionadas