Mac OS X上的Java应用程序并不总是从操作系统接收打开的文件事件

时间:2012-09-17 17:11:53

标签: java macos event-handling

我的java应用程序的主类有一个静态初始化程序,我们在调用main()之前设置ApplicationAdapter来监听来自操作系统的通知。到目前为止,这已按预期工作。但是,最近(因为10.7?时间轴不确定),有时这不起作用。在调试应用程序之后,似乎就像操作系统在静态初始化程序仍在运行时在事件线程上异步发布文件打开事件一样。因此,有时初始化在文件打开事件发布之前完成(并且文件正确打开),有时,事件在初始化完成之前发布(即在我的应用程序有机会注册ApplicationListener之前),因此我的应用程序从不有机会处理事件,并且没有打开请求的文件。

还有其他人遇到过这个问题吗?

我尝试过的一种可能的解决方案是在主类的静态初始化程序的开头暂停事件队列,如:

static{
    final Object monitor = new Object();
    SwingUtilities.invokeLater( new Runnable(){
       public void run(){
            synchronized( monitor) {
                try{ monitor.wait(); } catch( Exception e ){ e.printStackTrace(); }
            }
       }
    });

    registerApplicationListener();

    synchronized( monitor) {
        try{ monitor.notifyAll(); }
        catch(Exception e){ e.printStackTrace(); }
    }
}

当应用程序初始化设置ApplicationListener以接收OS事件时,它会阻止事件分派。然而,问题仍然是操作系统仍然可以在初始化完成之前调度事件,就我所知,我无能为力。 Apple Java扩展API中没有任何内容指示任何控制事件调度行为的方法。我也无法通过Info.plist中的配置找到任何控制事件调度方面的方法。

1 个答案:

答案 0 :(得分:0)

确认这是来自OS X shell的文件打开事件。 Java应用程序无法可靠地捕获此通知,并且解决方法是安装启动守护程序以捕获通知并将其作为启动参数转发给应用程序。

为应用程序注册URL方案也可能有效但我从来没有尝试过使用Java应用程序希望params会出现在main()args