有趣的主题。我已经调查了 EventQueue 代码,虽然我还没有解决你的问题,但我可能有一些有用的指针:
- Oracle 的 EventQueue 实现不保留大小变量,因此除非您完全控制 EventQueue(请参阅 3),否则在使用 Oracle 的 JRE 时,没有比线性扫描队列更好的方法了。
- 您可以编写自己的 EventQueue(可能是复制粘贴 Oracle 的实现加上一些调整**将是最简单的)并用于
EventQueue.push(EventQueue)
安装您自己的实现。队列中的所有事件都将转移到您的队列中,因此您可以在它们发布到您的队列时对其进行计数。不幸的是,这仍然是线性扫描,但至少现在它是独立于平台的。
- 或者,您可以在创建原始事件队列后尽快安装您自己的 EventQueue 实现(参见 2)(在包含您的 main 方法的类开头的静态代码块中执行此操作)。然后,您的实现可以在发布所有事件时对其进行计数,并且在您想知道大小时不必扫描队列。您只需要希望没有其他人将自己的 EventQueue 推到您的之上;)
** 一些调整:我没有尝试过,但我会删除所有公共/受保护的静态代码(引用这些方法/变量的每个人都使用 java.awt.EventQueue,你也可以),添加大小变量并更新此变量有以下四种方法:postEvent(AWTEvent, int)
、getNextEventPrivate()
和。getNextEvent(int)
removeSourceEvent(Object, boolean)
此修改的一个大问题是 EventQueue 对具有默认可见性的 AWT 方法进行了一些调用(例如Toolkit.getEventQueue()
和Component.getAccessControlContext()
),因为您的实现将在不同的包中,所以不允许您调用这些方法。您必须为每种情况单独找到解决方法。