如何在OS X中使Java FileDialog接受目录作为其文件类型?

10

我正在尝试将应用程序从使用JFileChooser切换到FileDialog,以便在mac上运行时使用OS X文件选择器。到目前为止,我有以下代码:

    FileDialog fd = new FileDialog(this);
    fd.setDirectory(_projectsBaseDir.getPath());
    fd.setLocation(50,50);
    fd.setFile(?);
    fd.setVisible(true);
    File selectedFile = new File(fd.getFile());

我该在问题中填写什么?以便我的文件选择器允许任何目录成为文件选择器的输入(随后的方法已经检查确保目录是正确类型的目录,我只想FileDialog接受任何目录)。

3个回答

12

假设您决定使用FileDialog而不是可移植的JFileChooser,您需要设置系统属性,以便创建的FileDialog是用于目录的。

相关属性是apple.awt.fileDialogForDirectories

因此,只需执行以下操作:

System.setProperty("apple.awt.fileDialogForDirectories", "true");
FileDialog fd = new FileDialog(this); 
fd.setDirectory(_projectsBaseDir.getPath()); 
fd.setLocation(50,50);
fd.setVisible(true); 
File selectedFile = new File(fd.getFile());
System.setProperty("apple.awt.fileDialogForDirectories", "false");

需要注意的是,这并不是可移植的,但是,既然您想要替换可移植的JFileDialog,我认为这不是问题。


4
有没有Windows的等效替代品? - ThePrince

1

使用最受欢迎的解决方案一段时间后:

System.setProperty("apple.awt.fileDialogForDirectories", "true");

我无法解决原生文件对话框实现中按钮(仅英语)的翻译问题。

因此,我采用了一个在 macOS 上完美运行的解决方法:

try {
    Process process = Runtime.getRuntime().exec(new String[]{//
        "/usr/bin/osascript", //
        "-e", //
        "set selectedFolder to choose folder\n"//
        + "return POSIX path of selectedFolder"
    });
    int result = process.waitFor();
    if (result == 0) {
        String selectedFolder = new BufferedReader(new InputStreamReader(process.getInputStream())).readLine();
        return new File(selectedFolder);
    }
} catch (Exception ex) {
}

return null;

享受!


1
我正在尝试在我的应用程序在Mac上运行时从使用JFileChooser切换到FileDialog,以便它将使用OSx文件选择器。
我建议您尝试留在Swing世界中,并远离AWT这个更重的世界。如果您的问题是Swing L&F的问题,有办法解决。请查看此前的问题的帖子,其中链接到一个网站,显示如何在文件选择器中获取正确的Mac图标。
对于没有确切回答您问题的地方,请原谅我。如果您有其他原因希望继续使用FileDialog,我会很乐意删除此帖子。

我同意 - JFiloeChooser是一个更好的选择,他的问题听起来更像是外观和感觉的问题,而不是其他什么。 - aperkins
FileDialog 显示了 MacOS 平台的文件选择器(至少目前是这样),包括侧边栏和各种文件夹选项(例如新建文件夹、搜索等)。它在几乎所有方面都非常优秀,唯一的缺点是不能方便地允许程序员选择文件和/或文件夹。 - Christopher Schultz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接