![](/img/trans.png)
[英]Java application on Mac OS X does not always receive open file events from the OS
[英]Double click document file in Mac OS X to open Java application
我在應用程序包中有一個Java應用程序,我想將文件類型與之關聯。
例如,如果有文件
foo.example
當雙擊該文件或具有.example擴展名的任何文件時,我希望我的應用程序啟動並打開該文件。 我也希望文件有我的應用程序的圖標。
我想通過編輯info.plist文件來做到這一點,但它似乎不起作用。
另外,我的Java應用程序如何知道傳遞給它的文件?
以下是需要做的事情:
第一部分:
首先,您必須進行設置,以便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是一個終端工具,可以讓您知道任何問題。 如果它沒有錯誤返回,那么應該設置所有內容。
第二部分:
現在,當您雙擊以.example
結尾的文件時OS X將打開您的應用程序,您必須讓您的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
}
}
});
}
執行此操作后,您的應用將處理在您的應用啟動之前和應用啟動之后打開的文檔文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.