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
Esto puede ser un botín, pero lo que si su clara ByteBuffer antes de usarlo llamando 'buffer. clear(); '? –
Eso no hizo ninguna diferencia, desafortunadamente. – perp