双击Mac OS X中的文档文件以打开Java应用程序

ste*_*eve 11 java macos file-association

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

例如,如果有文件

foo.example

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

我想通过编辑info.plist文件来做到这一点,但它似乎不起作用.

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

Thu*_*rge 7

以下是需要做的事情:

第一部分:

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

此示例显示了您要添加到Info.plist文件的确切内容(请注意,尽管该示例适用于iOS,但它在OS X上的工作方式完全相同).我不会复制它的内容,但简而言之,你必须添加两个键:

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

请注意,有许多键CFBundleTypeExtensions与上面的键大致相同,但是自OS 10.5以来它们已被弃用,因此如果Apple完全删除它们,您不希望使用它们.

如果您添加所有这些并且文件类型关联似乎不起作用,您可以尝试使用lsregister调试问题,lsregister是一个终端工具,可以让您知道任何问题.如果它没有错误返回,那么应该设置所有内容.

第二部分:

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

您的应用将收到com.apple.eawt.AppEvent.OpenFilesEvent您需要处理的类型的事件.您可能会问自己如何处理在Java应用程序启动之前触发的事件,但似乎Java首先在应用程序的main方法中执行所有操作然后触发事件.因此,在同一线程的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
            }
        }

    });
}
Run Code Online (Sandbox Code Playgroud)

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