我有一个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
事件?或者谁负责操纵错误的事件?
提前感谢!!
好的,我通过简单的远程调试和stepping找到了问题的原因。抛出了事件传递的所有步骤。这很烦人,因为没有解决方案来分析下一个此类问题
在我的案例中,问题是在恶意模块的深处,一个名为KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(..)
和KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(..)
的类将事件重定向到它的对象,以对KeyEvents做出反应,即使它们发生在子组件中。
问题是这个调度器和处理器调用了e.consume()
,这可能会影响KEY_TYPED
事件的创建。事实是,当删除事件的消耗时,一切都会正常工作。
在eclipse内部,这件事并没有发生,因为有些类不在类路径上,因此在查找失败后,此时就没有调用恶意类。令人沮丧。
尽管我找到了解决方案,但有趣的是,我可以采取哪些步骤来调试这样的东西?或者是否有任何关于如何在低级别创建事件的文档?