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

时间:2009-10-15 21:28:15

标签: java macos file-association

我在应用程序包中有一个Java应用程序,我希望将文件类型与。

相关联

例如,如果有文件

foo.example

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

我想通过编辑info.plist文件来做到这一点,但它似乎没有用。

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

2 个答案:

答案 0 :(得分:6)

以下是需要做的事情:

第一部分:

首先,您需要进行设置,以便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
            }
        }

    });
}

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

答案 1 :(得分:1)