对于 Swing 应用程序,通过 JNA 调用 GetOpenFileName 失败

2024-01-14

我正在尝试使用 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,其中根据MSDN http://msdn.microsoft.com/en-us/library/ms646916(v=vs.85).aspx is:

CDERR_初始化0x0002

初始化时公共对话框功能失败。当没有足够的内存可用时,通常会发生此错误。

...这对我来说并没有多大帮助。我在这里做错了什么?


我已将其他来源放在 PasteBin 上,这样我就不会把问题搞得太混乱:

OpenFileDialog: http://pastebin.com/HDmu0TjX http://pastebin.com/HDmu0TjX

ComDlg32JNA: http://pastebin.com/X5F5LLip http://pastebin.com/X5F5LLip


最好不要从 Swing EDT 中执行任何 JNA 代码。尝试使用摇摆工人 http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html在后台线程中运行对话框。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于 Swing 应用程序,通过 JNA 调用 GetOpenFileName 失败 的相关文章

随机推荐

  • 如何使用 Django URL 命名空间?

    我正在努力掌握窍门Django URL 命名空间 http docs djangoproject com en dev topics http urls defining url namespaces 但我找不到任何示例或文档 这是我尝试过
  • CloudKit - 完整且完整的错误处理示例

    Apple 非常清楚 他们在每个视频中都表示 处理错误的 CloudKit 应用程序和不处理错误的 CloudKit 应用程序之间的区别就是工作应用程序和不处理错误的应用程序之间的区别 但是 我无法在任何地方找到每个错误含义的正确列表 哪些
  • Tensorflow/keras:“logits和标签必须具有相同的第一维”如何​​压缩logits或扩展标签?

    我正在尝试制作一个简单的 CNN 分类器模型 对于我的训练图像 BATCH SIZEx227x227x1 和标签 BATCH SIZEx7 数据集 我使用 numpy ndarrays 它们通过批量输入到模型中ImageDataGenera
  • 为什么不能以发布模式建立网站?

    在 ASP Net 中 如果我设置Web应用程序我可以将其配置为释放模式但有一个website我只能将配置设置为调试模式 为什么是这样 在网站项目中 每个页面都是根据第一次请求动态编译的 除非您在配置文件中另有指定 否则它将在不调试符号的情
  • Node js 单元测试:模拟需要依赖

    我在为以下设置编写单元测试作为 jira js 文件 在 node js 模块中 时遇到问题 var rest require restler https www npmjs com package restler module expor
  • 将 pyno 与我现有的 python 安装一起使用

    我正在尝试使用 PyUNO 作为从 Django 服务器内将不同文档格式 doc wordperfect html 等 转换为 PDF 的方法 我很难受import uno上班 做的时候好像失败了import pyuno 带有一条消息Imp
  • 从 Drupal 站点内重定向到新页面

    我正在使用 Drupal 站点 我们想要设置一个重定向到外部站点的特殊 URL 换句话说 如果http www mysite com http www mysite com是我们的 Drupal 网站 我们想要http www mysite
  • 美元符号和/或破折号破坏 Razor 的解析器

    我试图呈现的最终结果
  • clojurescript:触摸事件和 Domina

    我无法从 Domina 的 touchstart 事件中获取 touch 或 changedTouches 列表 这是我的 require 东西 ns myproj require macros hiccups core as h requ
  • 如何显示小时范围

    我有一个数据库表 以 TIME 格式存储餐厅的营业时间作为时间范围 例如 如果餐厅的营业时间是 上午 9 点至下午 5 点 则会有 2 列 hours open 和 hours close 我将 9 00 存储在 hours open 中
  • 如何查看文本通道的权限值? [不和谐.py]

    我想检查文本通道是否已将权限设置为特定值 特别是发送信息允许 基本上我想要这样的东西 bot command async def perm ctx channel discord TextChannel None if send messa
  • 如何获取视图中的列级依赖关系

    我已经对这个问题进行了一些研究 但还没有解决方案 我想要得到的是视图中的列级依赖关系 所以 假设我们有一张这样的表 create table TEST first name varchar 10 last name varchar 10 s
  • 滚动时图像变化

    继另一个那么问题 https stackoverflow com questions 15861645 change image on scroll 该脚本更改页面滚动上的图像 然而 如果该脚本用于包含 200 多个图像的视频帧 则该脚本将
  • 配置 redis 以一致地首先逐出旧数据

    我在 redis 中存储了一堆实时数据 我将所有按键的 TTL 设置为 14400 秒 4 小时 我已将 maxmemory 设置为 10G 目前内存中的空间不足以容纳 4 小时的数据 而且我没有使用虚拟内存 因此 Redis 会在数据过期
  • 如何计算每个id的总和

    使用水晶报表7 我想查看表1和表2的总和 table1 id name 001 raja 002 vijay 003 suresh table2 id value 001 100 001 200 001 150 002 200 003 15
  • 使用画布(三.js)覆盖画布(WebGL)

    我有两块画布 第一个应该是背景 其内容通过原始 WebGL 3D 渲染 第二个画布应该覆盖第一个画布 并且主要是透明的 它的内容通过 Three js 3D 内容 呈现 不幸的是 第二个画布不是绘制在第一个画布的上面 而是绘制在它的旁边 如
  • 如何使用 swiftUI 创建平滑的颜色变化动画? (有问题的例子)

    I have a play pause button that changes when pressed At the moment it just fades in and out but I would like it to perfo
  • C# 将 Lambda 表达式函数转换为描述性字符串

    我有一个完全不必要的困境 我正在懒洋洋地寻找一个将 lamda 表达式转换为字符串的函数 让我烦恼的是 我每次都输入这个缓存键 但我真的不想花时间创建它 我想将它用于我创建的缓存函数 如果我想获取一个人的名字而不是每次都调用该函数 那么在哪
  • 直观地看 For 循环中 fork() 会发生什么

    我一直在试图理解fork http en wikipedia org wiki Fork system call 行为 这次在一个for loop 观察以下代码 include
  • 对于 Swing 应用程序,通过 JNA 调用 GetOpenFileName 失败

    我正在尝试使用 Java 中的本机 Windows 文件对话框 使用 JNA 调用 comdlg32 函数GetOpenFileName 我做了一个静态方法 OpenFileDialog display看起来像这样 public stati