2011-07-23 6 views
6

Estoy tratando de usar el diálogo de archivo nativo de Windows en Java, usando JNA para llamar a la función comdlg32 GetOpenFileName. He hecho un método estático, OpenFileDialog.display que tiene este aspecto:Llamando a GetOpenFileName a través de JNA falla para la aplicación Swing

public static List<File> display(Window parent, boolean allowMultiSelect) 

es conveniente devolver los archivos seleccionados, o null si el usuario ha cancelado el diálogo.

Tengo dos programas de prueba simples. Esta funciona como se esperaba:

package nativedialogs; 

import java.io.File; 
import java.util.List; 

public class SimpleTest { 

    public static void main(String[] args) { 
     List<File> files = OpenFileDialog.display(null, true); 
     System.out.println(files); 
    } 
} 

Ésta, sin embargo, no:

package nativedialogs; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class SwingTest { 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       JButton button = new JButton("Open file dialog"); 
       button.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         List<File> files = OpenFileDialog.display(f, true); 
         // These also fail: 
         // List<File> files = OpenFileDialog.display(f, false); 
         // List<File> files = OpenFileDialog.display(null, true); 
         // List<File> files = OpenFileDialog.display(null, false); 
         System.out.println(files); 
        } 
       }); 
       f.add(button); 
       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 

Para este último ejemplo, CommDlgExtendedError devuelve 2, en el que according to MSDN es:

CDERR_INITIALIZATION 0x0002

La función de cuadro de diálogo común falló durante la inicialización. Este error a menudo ocurre cuando no hay suficiente memoria disponible.

... que realmente no me ayuda demasiado. ¿Qué estoy haciendo mal aquí?


He puesto las otras fuentes en Pastebin, para no estorbar la pregunta demasiado:

OpenFileDialog: http://pastebin.com/HDmu0TjX

ComDlg32JNA: http://pastebin.com/X5F5LLip

+0

Esto puede ser un botín, pero lo que si su clara ByteBuffer antes de usarlo llamando 'buffer. clear(); '? –

+0

Eso no hizo ninguna diferencia, desafortunadamente. – perp

Respuesta

1

Es mejor no hacer cualquier código JNA del Swing EDT. Intente usar SwingWorker para ejecutar el diálogo en una cadena de fondo.

que iba a tratar de ayudar más, pero no hay comdlg32 en mi Win 7 64-bit :(

+0

Gracias por la sugerencia, pero hacerlo en un hilo de fondo tampoco ayudó. :-(Es curioso que no tengas el DLL, ' porque también ejecuto Win 7 64 y lo tengo. – perp

+1

@perp: ¿qué versión de jna estás usando? Cuando ejecuto tu código con 3.3.0, arroja una UnsatisfiedLinkException. Pero funciona bien con 3.2.7, evento del Swing test. –

+0

Parece que no puedo hacer que funcione con ninguna de las versiones. También probé JVM de 32 y 64 bits. A continuación, intentaré el mapeo directo, y ma Incluso puede omitir JNA e ir directamente con JNI, solo para ver dónde está el problema. – perp

Cuestiones relacionadas