繁体   English   中英

是否可以保证调用KeyListener的顺序?

[英]Is the order in which KeyListeners will be called guaranteed?

addKeyListenerremoveKeyListenergetKeyListeners或相关教程的文档中,我可能对此缺少明显之处,但是是否可以保证运行添加的键侦听器的顺序? 我希望它们按照添加的顺序运行,但是我看不到在任何地方都指定了它们。

我遇到的情况是我需要向现有Component添加一个键侦听器,并为特定键覆盖现有的键侦听器。 似乎应该可以通过以下方式做到这一点:

  • 使用getKeyListeners查找所有现有的键侦听器。
  • 使用removeKeyListener删除每个现有的键侦听removeKeyListener
  • 使用addKeyListener添加我的密钥侦听器。 (这仅处理选定的按键,并在事件发生时使用该事件。)
  • 最后,使用addKeyListener重新添加在第一步中找到的所有关键侦听addKeyListener

但是,如果事实证明它不适用于特定的JVM等,则我不想这样做。

我不太了解你的情况。 对我来说,依靠听众被叫的顺序似乎有些模糊。

您是否不仅可以创建检测事件发生时间的键侦听器包装器类,还可以将事件委托给包装的侦听器类(如果合适)?

我认为有更好的方法可以实现您想要的目标,而无需依赖于听众的排序,除非我误解了!

我不知道订单是否得到保证。

但是,您可以稍作修改以使其在大多数情况下都可以使用:将步骤1、2和3保持不变,但将键侦听器列表存储在自定义键侦听器中,并且不要将其添加回组件的侦听器中。

在自定义侦听器内部,在完成自己的处理后,在每种方法中,都调用保存的侦听器的方法。 伪代码:

void keyPressed(event) {
  // do some magic
  for (listener: savedListeners)
    listener.keyPressed(event);
}

阅读文档后,似乎可以保证KeyEvent会入队并按顺序进行处理。 但是它并没有说明KeyListener 对我来说,这将不会有任何保证,因为每个侦听器都作为单独的线程运行。

所以,我在这里投票给Phill Mat的建议也很好。

我希望它们按照添加的顺序运行,但是我看不到在任何地方都指定了它们。

没有保证的订单。

我相信当前实现的顺序是所有侦听器(不仅是关键侦听器)都以添加它们的相反顺序运行。

查看EventListenerList类,我相信它是用于实现此功能的类。

当然,这很容易测试。 您只需在组件中添加几个侦听器,并在调用每个侦听器时显示一条消息即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM