【发布时间】:2011-10-11 16:32:22
【问题描述】:
我正在尝试使用 Java 中的本机 Windows 文件对话框,使用 JNA 调用 comdlg32 函数 GetOpenFileName。我做了一个静态方法,OpenFileDialog.display,看起来像这样:
public static List<File> 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<File> 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<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);
}
});
}
}
对于后一个示例,CommDlgExtendedError 返回 2,according to MSDN 是:
CDERR_INITIALIZATION 0x0002
普通对话框函数在初始化过程中失败。当没有足够的内存可用时,通常会发生此错误。
...这对我帮助不大。我在这里做错了什么?
我已将其他来源放在 PasteBin 上,因此我不会过多地混淆问题:
OpenFileDialog:http://pastebin.com/HDmu0TjX
ComDlg32JNA:http://pastebin.com/X5F5LLip
【问题讨论】:
-
这可能是一个 SWAG,但是如果您在使用之前通过调用
buffer.clear();清除 ByteBuffer 会怎样? -
很遗憾,这并没有什么不同。
标签: java winapi swing jna comdlg32