java如何找出谁破坏了密钥类型的事件?
我有一个Java应用程序,其中有许多文本字段,我可以通过按`
然后按e
来输入é
。这是许多应用程序已知的行为
现在,在特定的用户操作(启动应用程序的特定模块)之后,应用程序中的所有文本字段都将无法键入é
以下是我所做的:
它是在Windows还是Linux上发生的?只有窗户
它会发生在特定的JVM上吗?AFAI没有——使用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 楼答案
好的,我通过远程调试和单步抛出事件通过的所有步骤找到了问题的原因。这很烦人,因为没有解决方案来分析下一个这样的问题
在我的例子中,问题是在恶意模块的深处,有一个名为
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(..)
和KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(..)
的类将事件重定向到它的对象,以对KeyEvents做出反应,即使它们发生在子组件中问题是,这个调度器和处理器调用了
e.consume()
,这可能会影响KEY_TYPED
事件的创建。事实是,当移除事件的消耗时,一切都正常在eclipse内部,这件事没有发生,因为有些类不在类路径上,因此在查找失败后,恶意类没有被调用。令人沮丧
尽管我找到了解决方案,但我可以做哪些步骤来调试类似的东西还是很有趣的?或者,是否有关于如何在低级别创建事件的文档