双击 Mac OS X 中的文档文件以打开 Java 应用程序
我在应用程序包中有一个 Java 应用程序,我想与它关联文件类型。
例如,如果有一个文件
foo.example
双击该文件或扩展名为 .example 的任何文件时,我希望我的应用程序启动并打开该文件。我还希望文件具有我的应用程序的图标。
我想通过编辑info.plist文件来执行此操作,但它似乎不起作用。
另外,我的 Java 应用程序如何知道传递给它的哪个文件?
我在应用程序包中有一个 Java 应用程序,我想与它关联文件类型。
例如,如果有一个文件
foo.example
双击该文件或扩展名为 .example 的任何文件时,我希望我的应用程序启动并打开该文件。我还希望文件具有我的应用程序的图标。
我想通过编辑info.plist文件来执行此操作,但它似乎不起作用。
另外,我的 Java 应用程序如何知道传递给它的哪个文件?
以下是需要做的:
第一部分:
首先,您必须进行设置,以便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
}
}
});
}
执行此操作后,你的应用将处理在应用启动之前和应用启动后打开的两个文档文件。