通过JNA调用GetOpenFileName对于Swing应用程序失败
我正在尝试使用Java中的本机Windows文件对话框,使用JNA调用comdlg32函数GetOpenFileName
。 我做了一个静态方法, OpenFileDialog.display
看起来像这样:
public static List display(Window parent, boolean allowMultiSelect)
它应该返回所选文件,如果用户取消了对话框,则返回null。
我有两个简单的测试程序。 这个按预期工作:
package nativedialogs; import java.io.File; import java.util.List; public class SimpleTest { public static void main(String[] args) { List files = OpenFileDialog.display(null, true); System.out.println(files); } }
但是,这个不是:
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 files = OpenFileDialog.display(f, true); // These also fail: // List files = OpenFileDialog.display(f, false); // List files = OpenFileDialog.display(null, true); // List files = OpenFileDialog.display(null, false); System.out.println(files); } }); f.add(button); f.pack(); f.setVisible(true); } }); } }
对于后一个示例, CommDlgExtendedError
返回2, 根据MSDN ,它是:
CDERR_INITIALIZATION 0x0002
初始化期间,公共对话框function失败。 当没有足够的内存时,通常会发生此错误。
……这对我来说并没有那么大的帮助。 我在这做错了什么?
我把其他资源放在了PasteBin上,所以我不会过多地混淆这个问题:
OpenFileDialog
: http : //pastebin.com/HDmu0TjX
ComDlg32JNA
: http : //pastebin.com/X5F5LLip
最好不要从Swing EDT中执行任何JNA代码。 尝试使用SwingWorker在后台线程中运行该对话框。
我试着帮助更多,但我的Win 7 64位上没有comdlg32 🙁