我的 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 中的配置找到控制事件分派任何方面的任何方法。