gpt4 book ai didi

java - Swing 应用程序通过 JNA 调用 GetOpenFileName 失败

转载 作者:搜寻专家 更新时间:2023-10-30 23:00:41 29 4
gpt4 key购买 nike

我尝试在 Java 中使用 native 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

The common dialog box function failed during initialization. This error often occurs when sufficient memory is not available.

...这对我帮助不大。我在这里做错了什么?


我已将其他资源放在 PasteBin 上,这样我就不会把问题搞得一团糟:

OpenFileDialog:http://pastebin.com/HDmu0TjX

ComDlg32JNA:http://pastebin.com/X5F5LLip

最佳答案

最好不要从 Swing EDT 执行任何 JNA 代码。尝试使用 SwingWorker在后台线程中运行对话框。

我会尽力提供更多帮助,但我的 Win 7 64 位上没有 comdlg32 :(

关于java - Swing 应用程序通过 JNA 调用 GetOpenFileName 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6801242/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com