如何找出谁破坏KEY_TYPED事件?

时间:2013-11-29 10:19:38

标签: java swing event-handling awt keyevent

我有一个包含许多文本字段的Java应用程序,我可以按é然后`输入例如e。这是许多应用程序中已知的行为。

现在,在特定用户操作(启动应用程序的特定模块)之后,应用程序中的所有文本字段都将无法键入é

这是我做的:

是在Windows还是Linux上发生?只有Windows。

特定JVM是否会发生这种情况? AFAIS没有 - 使用6-32 / 64和7-32 / 64我能够重现这个问题。

是否会因应用程序的特定代码库而发生?是的,但它可能是有用的信息,我无法从Eclipse中重现问题。只是打包的应用程序有问题。

发生了什么事?

在启动模块之前:

*!*!* dispatching: java.awt.event.KeyEvent[KEY_PRESSED,keyCode=129,keyText=Akut (Dead),keyChar='┤',keyLocation=KEY_LOCATION_STANDARD,rawCode=221,primaryLevelUnicode=180,scancode=13,extendedKeyCode=0x81] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_RELEASED,keyCode=129,keyText=Akut (Dead),keyChar='┤',keyLocation=KEY_LOCATION_STANDARD,rawCode=221,primaryLevelUnicode=180,scancode=13,extendedKeyCode=0x81] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_PRESSED,keyCode=69,keyText=E,keyChar='e',keyLocation=KEY_LOCATION_STANDARD,rawCode=69,primaryLevelUnicode=101,scancode=18,extendedKeyCode=0x45] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unbekannt keyCode: 0x0,keyChar='Ú',keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_RELEASED,keyCode=69,keyText=E,keyChar='e',keyLocation=KEY_LOCATION_STANDARD,rawCode=69,primaryLevelUnicode=101,scancode=18,extendedKeyCode=0x45] on mainFrame

启动模块后:

*!*!* dispatching: java.awt.event.KeyEvent[KEY_PRESSED,keyCode=129,keyText=Akut (Dead),keyChar='┤',keyLocation=KEY_LOCATION_STANDARD,rawCode=221,primaryLevelUnicode=180,scancode=13,extendedKeyCode=0x81] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_RELEASED,keyCode=129,keyText=Akut (Dead),keyChar='┤',keyLocation=KEY_LOCATION_STANDARD,rawCode=221,primaryLevelUnicode=180,scancode=13,extendedKeyCode=0x81] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_PRESSED,keyCode=69,keyText=E,keyChar='e',keyLocation=KEY_LOCATION_STANDARD,rawCode=69,primaryLevelUnicode=101,scancode=18,extendedKeyCode=0x45] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unbekannt keyCode: 0x0,keyChar='e',keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on mainFrame
*!*!* dispatching: java.awt.event.KeyEvent[KEY_RELEASED,keyCode=69,keyText=E,keyChar='e',keyLocation=KEY_LOCATION_STANDARD,rawCode=69,primaryLevelUnicode=101,scancode=18,extendedKeyCode=0x45] on mainFrame

正如您在输出中看到的那样,编码显然是我不了解的一点。因此编码可能是一个问题,即使我不知道在哪里设置它以及为什么问题只会在特定时间点之后发生。所以我个人认为编码不是原因。我尝试使用-Dfile.encoding=Cp1252 -Dfile.encoding=ISO-8859-15但问题仍存在于Eclipse之外的Windows上,并且不会发生在Linux或Eclipse内部。

那么我期待什么?我需要一个可以告诉我应该寻找的人找到这个奇怪问题的原因。我发现有关KeyEvents的任何文档对于初学者来说太多了,我需要文档来说明我现在所处的位置。谁构建了KEY_TYPED事件?或谁负责操纵错误的事件?

提前致谢!!

1 个答案:

答案 0 :(得分:1)

好的,我通过简单的远程调试找到了问题的原因,并逐步抛出事件传递的所有步骤。这很烦人,因为没有解决方案如何分析下一个问题。

在我的案例中,问题在于恶意模块内部有一个名为KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(..)KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(..)的类,可以将事件重定向到它的对象,以便对KeyEvents做出反应,即使它们出现在子组件中也是如此。 / p>

问题是这个调度程序和处理程序调用{​​{1}}可能会影响e.consume()事件的创建。事实是,当消除事件的消耗时,一切正常。

在eclipse中,事情没有发生,因为某些类不在类路径上,因此在查找失败后,恶意类在此时未被调用。令人沮丧。

即使我找到了解决方案,但我可以采取哪些步骤调试类似的内容?或者是否有关于如何创建低级别事件的文档?