【问题标题】:Missing OpenFilesEvent for JavaFX on MacMac 上的 JavaFX 缺少 OpenFilesEvent
【发布时间】:2016-04-06 18:44:52
【问题描述】:

我有一个 JavaFX 8 桌面应用程序,并且我正在创建一个 .app 应用程序包以将该应用程序分发给 Mac 用户。我使用 Oracle “自包含应用程序打包”工具来生成捆绑包。

我遇到的问题与与我的应用程序关联的文件有关。我将扩展名.wordy 与这些文件相关联。如果我打开应用程序并在 Mac Finder 中双击其中一个文件,我的应用程序会收到一个包含文件路径的OpenFilesEvent,并且一切正常。但是,如果应用程序未打开,则在 Finder 中双击 .wordy 文件会按预期打开我的应用程序,但我从未收到包含用户双击文件路径的事件。

文件关联是在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 文件路径的事件?

为了完整起见,我使用的是适用于 Mac 的 Oracle JDK 1.8.0_66。

【问题讨论】:

    标签: java macos javafx javafx-8


    【解决方案1】:

    我用你的代码测试过,也遇到了这个问题。 但是当我直接在start(Stage primaryStage)方法中使用代码来监听时:

    Application lowLevelApp = com.sun.glass.ui.Application.GetApplication();
    lowLevelApp.setEventHandler {...}
    

    第一次双击文件时,我可以得到 OpenFilesEvent。

    【讨论】:

    • 你是对的,确实如此!我不确定如何利用它来干净地解决问题,因为它使用 com.sun... 类,而且似乎也很低级。不过,这是一个有趣的线索。
    【解决方案2】:

    此问题的错误数据库中有一个条目。 https://bugs.openjdk.java.net/browse/JDK-8187992

    【讨论】:

      【解决方案3】:

      您可能在应用程序初始化期间调用 application.setOpenFileHandler() 代码太晚了。尝试尽早在 main() 中调用它,看看是否能解决问题。我不确定 Mac OS X 何时将 OpenFile 事件传递给 Java,但如果那时您还没有通过调用 application.setOpenFileHandler() 进行准备,那么该事件将会丢失。

      【讨论】:

      • 感谢您的建议@Saeid Nourian。不幸的是,这似乎不是问题的原因。我尝试通过破解代码并添加Application.getApplication().setOpenFileHandler(e -&gt; LOG.info("Received event {}", e)); 行作为main() 中的第一行(并删除其他侦听器注册以进行良好测量)来进行双重检查。双击.wordy 文件以打开应用程序仍不会调用侦听器。和以前一样,只有在应用程序已经打开时才会调用它。
      • 这很奇怪。我不确定是什么原因造成的,但请随时查看我们的工作应用程序以与您的代码进行比较:github.com/concord-consortium/energy3d
      • 附注在我的代码中,我在创建 JFrame gui 之后但在使其可见之前调用了 Application.getApplication().setOpenFileHandler()。不确定这是否会有所不同。
      • 谢谢。我看一下代码,看看有没有明显的区别。
      • 顺便说一句,你有哪个版本的 Mac OS X?我记得在 OS X 10.6 setOpenFileHandler 对我来说并不可靠。试试这个,下载我的应用程序,看看文件关联是否适用于我在您的 OS X 机器上的应用程序:runiter.com/graphing-calculator/download.htm
      【解决方案4】:

      供将来参考:让 openFileHandler 正常工作可能非常棘手。处理程序是从 UI 事件线程上的事件处理程序调用的,这意味着当处理程序运行时无法保证 main() 已完成。为获得最佳结果,应使用静态初始化程序设置 openFileHandler,并且 main() 和打开文件处理程序都应在 UI 事件线程上调用相同的初始化代码,并且如果调用超过一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-09
        • 1970-01-01
        • 1970-01-01
        • 2020-02-09
        • 2020-03-09
        • 1970-01-01
        • 2018-06-16
        相关资源
        最近更新 更多