【问题标题】:Opening Finder/Explorer using Java Swing使用 Java Swing 打开 Finder/Explorer
【发布时间】:2012-09-02 15:00:10
【问题描述】:

我正在创建一个应用程序,在该应用程序中,用户实际上可以很容易地单击应用程序中的链接,该链接会在 Finder(在 Mac 中)/Windows 资源管理器中打开一个特定文件夹。这可能发生在链接或按钮的点击事件中。

有没有办法通过 Swing 打开这些本地操作系统应用程序(针对特定文件夹)?

【问题讨论】:

  • “特定文件夹” 系统文件夹,由您的应用创建的目录。或应用程序。安装程序,还是别的什么?
  • 更重要的是,这提供了哪些用户功能?浏览用户媒体?浏览已安装的模板/插件?看应用。安装/属性目录? ..

标签: java macos swing runtime desktop


【解决方案1】:

简答:

if (Desktop.isDesktopSupported()) {
    Desktop.getDesktop().open(new File("C:\\"));
}

长答案: 虽然读取它是什么操作系统,然后运行特定于操作系统的命令会起作用,但它在一定程度上需要对需要完成的操作进行硬编码。

让 Java 处理每个操作系统应该如何打开目录。不应该让我们头疼。

阅读#open(File) 方法文档表明它将在所有支持该操作的操作系统上打开链接。如果当前平台不支持打开文件夹或文件(比如无头环境?当然,我猜想为什么它不会打开),它会抛出一个UnsupportedOperationException。如果用户无权读取该文件夹(Windows Vista/7/8,基于 Unix 的机器),您将获得 SecurityException。所以如果你问我,它处理得很好。

更新: 在获取 Desktop 对象之前添加了一个 if 检查,这样您的代码就可以避免 #getDesktop() Java Documentation 中提到的讨厌的 HeadlessExceptionUnsupportedOperationException 异常。

【讨论】:

  • 如果 JRE 1.6+ 可用,+1 以获得最简单的跨平台解决方案。
  • 在 Apple 多次尝试使用 Desktop.getDesktop().browse(new File("/Users/John/Desktop").toURI()); 失败后,这个解决方案拯救了我,这在 Windows 上运行良好。在 Apple 上,症状是将 Finder 打开到上次浏览的位置。我的错误(“浏览”使用不当,所以想分享)。
  • 在某些情况下,在调用 Desktop 的方法之前检查是否支持所需的操作可能会很方便,例如Desktop.getDesktop().isSupported(Desktop.Action.OPEN).
  • 在我的 mac (10.12.4, java 8) browse(uri)open(file) 仅适用于目录。对于他们抛出的文件java.security.PrivilegedActionException。解决方案是使用本机操作系统特定的方式,例如在 Mac 上使用 open --reveal path 或在 Windows 上使用 explorer.exe /select,path。请参阅stackoverflow.com/a/18004334/418358 的示例
  • +Roman Chernyatchik 一般来说,我建议不要在您的应用程序中实现特定于操作系统的代码。 Java 应该把它抽象出来。如果您必须对特定于操作系统的二进制文件进行低级别调用,我会尝试寻找替代方案。
【解决方案2】:

使用Runtime.getRuntime().exec("command here");在运行java的系统中执行命令。

对于 explorer.exe,您可以简单地将文件夹的绝对路径作为参数传递,例如

Explorer.exe "C:\Program Files\Adobe"

在 Mac OS X 中,您可以使用 open 命令:

open /users/

您可以了解如何检测您正在使用的操作系统,以及要运行的代码,here。例如,如果您在 Windows 上,这将检查:

public static boolean isWindows() {

    String os = System.getProperty("os.name").toLowerCase();
    // windows
    return (os.indexOf("win") >= 0);

}

【讨论】:

  • JRE 1.5 及更早版本的合理回退。
【解决方案3】:

这将从文件系统中获取一个文件:

public static File selectDirectory(JFrame frame, File file, JComponent component, String title) {

    File selectedFile = null;

    if ("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"
            .equalsIgnoreCase(UIManager.getSystemLookAndFeelClassName())) {
        JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        String absPath = file.getAbsolutePath();
        fc.setSelectedFile(new File(absPath));

        int returnVal = fc.showOpenDialog(component);

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            selectedFile = fc.getSelectedFile();
        }
    } else {
        System.setProperty("apple.awt.fileDialogForDirectories", "true");

        FileDialog fd = new FileDialog(frame, title, FileDialog.LOAD);
        String absPath = file.getAbsolutePath();
        fd.setDirectory(absPath);
        fd.setFile(absPath);

        fd.setVisible(true);

        if (fd.getFile() != null) {
            String selectedFileName = fd.getDirectory() + File.separator + fd.getFile();
            selectedFile = new File(selectedFileName);
        }
    }

    return selectedFile;
}

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多