I'm trying to use the native Windows file dialog in Java, using JNA to call the comdlg32 function GetOpenFileName
. I've made a static method, OpenFileDialog.display
that looks like this:
public static List<File> display(Window parent, boolean allowMultiSelect)
It should return the selected files, or null if the user canceled the dialog.
I have two simple test programs. This one works as expected:
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);
}
}
This one, however, does not:
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);
}
});
}
}
For the latter example, CommDlgExtendedError
returns 2, which according to MSDN is:
CDERR_INITIALIZATION 0x0002
The common dialog box function failed during initialization. This error often occurs when sufficient memory is not available.
...which doesn't really help me all that much. What am I doing wrong here?
I've put the other sources on PasteBin so I wouldn't clutter the question too much:
OpenFileDialog
: http://pastebin.com/HDmu0TjX
ComDlg32JNA
: http://pastebin.com/X5F5LLip
It's better not to do any JNA code from the Swing EDT. Try using SwingWorker to run the dialog in a background thread.
I'd try to help more, but there is no comdlg32 on my Win 7 64-bit :(