java - 在 Mac OS X 中双击文档文件打开 Java 应用程序

标签 java macos file-association

我在应用程序包中有一个 Java 应用程序,我想将其与文件类型相关联。

例如,如果有一个文件

foo.example

当双击该文件或任何具有 .example 扩展名的文件时,我希望我的应用程序启动并打开该文件。我还希望这些文件具有我的应用程序的图标。

我想通过编辑 info.plist 文件来完成此操作,但它似乎不起作用。

此外,我的 Java 应用程序如何知道传递给它的文件是什么?

最佳答案

这里是需要做的事情:

第一部分:

首先,您必须进行设置,以便 OS X 知道 .example 扩展名应该与您的应用相关联。这是通过应用的 Info.plist 文件完成的,前提是您已经将 Java 代码捆绑到 .app 包中(请参阅其他问题以了解如何执行此操作)。

This example向您确切显示要添加到 Info.plist 文件中的内容(请注意,尽管该示例是针对 iOS 的,但它在 OS X 上的工作方式完全相同)。我不会重复它所说的内容,但简而言之,您必须添加两个键:

  • CFBundleDocumentTypes:让 OS X 知道应用程序可以打开的文档类型
  • UTExportedTypeDeclarations:告诉 OS X 有关此应用程序特定的自定义文档类型,在本例中为 .example 文件

请注意,有许多键(例如 CFBundleTypeExtensions)与上述键的作用大致相同,但自 OS 10.5 以来它们已被弃用,因此您不想使用以防 Apple 完全删除它们。

如果你添加了所有这些并且文件类型关联似乎不起作用,你可以尝试 debug the problem using lsregister ,一个终端工具,可以让您了解任何问题。如果它返回时没有错误,那么一切都应该设置好了。

第二部分:

现在,当您双击以 .example 结尾的文件时,OS X 将打开您的应用程序,您必须让您的 Java 应用程序知道如何处理正在打开的文件。

您的应用将收到一个类型为 com.apple.eawt.AppEvent.OpenFilesEvent 的事件,您需要处理该事件。您可能会问自己如何处理在 Java 应用程序启动之前触发的事件,但似乎 Java 首先执行应用程序的主要方法中的所有内容,然后触发事件。因此,在同一线程的 main 方法的某处,使用以下代码创建监听器:

//First, check for if we are on OS X so that it doesn't execute on 
//other platforms. Note that we are using contains() because it was 
//called Mac OS X before 10.8 and simply OS X afterwards
if (System.getProperty("os.name").contains("OS X")){
    Application a = Application.getApplication();
    a.setOpenFileHandler(new OpenFilesHandler() {

        @Override
        public void openFiles(OpenFilesEvent e) {
            for (File file : e.getFiles()){
                //Handle your file however you'd like
            }
        }

    });
}

执行此操作后,您的应用将处理在您的应用启动之前和应用启动之后打开的文档文件。

关于java - 在 Mac OS X 中双击文档文件打开 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1575190/

相关文章:

java - 无法使用 Intent.ACTION_VIEW 在 Android 上打开 excel 文件

java - 在java中创建要在restful webservice中返回的XML数据

mongodb - 在mac中安装mongo shell

visual-studio - 如何在 VS2012 的 TFS 中更改文件关联?

linux - Linux 中 ASSOC 和 FTYPE 的等价物?

java - 即使在设置 Cache-Control 后,动态生成的 CSS 文件也不会被缓存

java - Hibernate SQLGrammarException : for a table having 3 different association mapping

java.lang.RuntimeException : Could not start Selenium session:

macos - 如何在Mac中的dmg文件中添加代码签名

VB.Net双击打开自定义文件时触发什么事件?