我有一个JavaFX 8桌面应用程序,我正在创建一个.app
应用程序包,以将应用程序分发给Mac用户。我使用Oracle“自包含应用程序打包”工具生成捆绑包。
我遇到的问题与我的应用程序相关的文件有关。我正在将扩展名.wordy
与这些文件相关联。如果我打开了应用程序并在Mac Finder中双击其中一个文件,我的应用程序会收到一个OpenFilesEvent
,其中包含文件的路径,一切正常。但是,如果应用程序未打开,双击Finder中的.wordy
文件会打开我的应用程序,但我从未收到包含用户双击文件路径的事件。< / p>
文件关联在Oracle“自包含应用程序打包”工具的Ant脚本中完成,如下所示:
<project name="VocabHunter Packaging" basedir=""
xmlns:fx="javafx:com.sun.javafx.tools.ant">
...
<fx:info title="VocabHunter">
<fx:association description="VocabHunter session"
extension="wordy"
mimetype="application/x-vnd.VocabHunterSession"
icon="${basedir}/icons/mac/VocabHunterSession.icns"/>
</fx:info>
...
</project>
在Java代码中,我获取com.apple.eawt.Application
的实例,然后注册OpenFilesEvent
的监听器,如下所示:
Application application = Application.getApplication();
application.setOpenFileHandler(new OsxOpenFilesHandler(listener));
您可以看到完整代码here。
有没有人知道如何解决这个问题,以便收到包含.wordy
文件路径的事件,即使应用程序在双击文件时没有运行?
为了完整性,我正在使用Oracle JDK 1.8.0_66 for Mac。
答案 0 :(得分:1)
我测试了你的代码并且也遇到了这个问题。
但是当我在start(Stage primaryStage)
方法中直接使用代码来监听时:
Application lowLevelApp = com.sun.glass.ui.Application.GetApplication();
lowLevelApp.setEventHandler {...}
首次双击文件时,我可以获得OpenFilesEvent。
答案 1 :(得分:1)
此问题在错误数据库中有一个条目。 https://bugs.openjdk.java.net/browse/JDK-8187992
答案 2 :(得分:0)
您可能在应用程序初始化期间太晚调用application.setOpenFileHandler()代码。尝试尽早在main()中调用它,看看是否能解决问题。我不确定Mac OS X何时将OpenFile事件传递给Java,但如果当时您还没有通过调用application.setOpenFileHandler()来准备那么事件将会丢失。
答案 3 :(得分:0)
供将来参考:让openFileHandler正常工作可能非常棘手。从UI事件线程上的事件处理程序调用处理程序,这意味着无法保证在运行处理程序时main()已完成。为了获得最佳结果,应使用静态初始化程序设置openFileHandler,并且main()和打开文件处理程序都应该在UI事件线程上调用相同的初始化代码,并且如果调用了多个初始化代码,则应该编写初始化代码。一次。