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

2022-09-04 22:27:39

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

例如,如果有一个文件

foo.example

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

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

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


答案 1

以下是需要做的:

第一部分:

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

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

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

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

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

第二部分:

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

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

//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
            }
        }

    });
}

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