Java filedialog总是在Mac中预先/ Users / <user> / Desktop

时间:2016-08-01 20:26:37

标签: java awt filechooser

我使用System.setProperty("apple.awt.fileDialogForDirectories", "true");仅选择文件夹。当我执行new java.io.File(fd.getFile()).getAbsolutePath();时,它总是返回/Users/<user>/Desktop/<folder>。假设我选择/用户,它将返回/Users/<user>/Desktop/Users。我该如何解决?

代码:

if (System.getProperty("os.name").toLowerCase().contains("mac")) {
        System.setProperty("apple.awt.fileDialogForDirectories", "true");

        FileDialog fd = new FileDialog(this, "Choose a folder to save streams", FileDialog.LOAD);
        fd.setDirectory(saveStreamLocTB.getText());

        fd.setVisible(true);

        String loc = new java.io.File(fd.getFile()).getAbsolutePath();
        if (loc != null) {
            p.setSaveStreamLoc(loc);
            saveStreamLocTB.setText(loc);
        }

        System.setProperty("apple.awt.fileDialogForDirectories", "false");
    }

修改我需要完整的路径

2 个答案:

答案 0 :(得分:1)

fd.getFile()返回相对路径,new File()将创建相对于执行目录的新File

  

默认情况下,java.io包中的类始终解析当前用户目录的相对路径名。此目录由系统属性user.dir命名,通常是调用Java虚拟机的目录。

因此,当您致电.getAbsolutePath()时,您正在使用的路径已被破坏。

调用fd.getDirectory() + fd.getFile()有效,但您应该避免使用字符串连接构建文件路径 - 这是two-argument File constructor的用途,所以改为:

String loc = new File(fd.getDirectory(), fd.getFile()).getAbsolutePath();

那就是说Java 7引入了更灵活,更强大的Path类,并且我建议尽可能在File上使用它。沿着相同的方向,Swing包含一个cross-platform file-chooser dialog,它比Apple的旧awt API更容易使用。如果您想尝试JavaFX,还有DirectoryChooser

答案 1 :(得分:0)

我明白了!

String loc = new java.io.File(fd.getFile()).getAbsolutePath();

需要成为这个

String loc = fd.getDirectory() + fd.getFile();