0

我的 java 应用程序的主类有一个静态初始化程序,我们在其中设置 ApplicationAdapter 以在调用 main() 之前侦听来自操作系统的通知。到目前为止,这已按预期工作。但是,最近(从 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 中的配置找到控制事件分派任何方面的任何方法。

4

1 回答 1

0

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

为应用程序注册 URL 方案也可能有效,但我从未在 Java 应用程序中尝试过,希望参数会出现在 main() 参数中

于 2012-09-17T17:19:16.003 回答