KeyListeners的调用顺序是否有保证?

时间:2011-03-11 14:31:54

标签: java awt keylistener

我可能在addKeyListenerremoveKeyListenergetKeyListeners或相关教程的文档中遗漏了一些明显的内容,但是对于添加的关键侦听器的顺序有任何保证跑?我希望它们按照添加顺序运行,但我没有看到它在任何地方都有说明。

我遇到的情况是我需要向现有的Component添加一个密钥监听器,并覆盖特定密钥的现有密钥监听器。似乎应该能够通过以下方式实现:

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

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

4 个答案:

答案 0 :(得分:4)

我不太了解你的情况。依赖于听众被调用的顺序对我来说似乎有点狡猾。

你能不能只创建一个密钥监听器包装类来检测你的事件发生的时间,并且如果适当的话,将事件委托给包装的监听器类?

我认为除非我误解了某些内容,否则有更好的方法可以实现你想要实现的目标而不依赖于听众的顺序!

答案 1 :(得分:1)

我不知道订单是否有保证。

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

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

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

答案 2 :(得分:1)

阅读完文档后,似乎可以保证KeyEvent将被排队并按顺序处理。但它没有提及KeyListener s。对我而言,它推断出不会有这种保证,因为每个听众都是作为一个单独的线程运行。

所以,我会在这里投票给PhillMat's建议也很好。

答案 3 :(得分:1)

  

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

订单无法保证。

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

查看EventListenerList类,我认为该类是用于实现此功能的类。

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