有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

    在我的例子中,问题是在恶意模块的深处,有一个名为KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(..)KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(..)的类将事件重定向到它的对象,以对KeyEvents做出反应,即使它们发生在子组件中

    问题是,这个调度器和处理器调用了e.consume(),这可能会影响KEY_TYPED事件的创建。事实是,当移除事件的消耗时,一切都正常

    在eclipse内部,这件事没有发生,因为有些类不在类路径上,因此在查找失败后,恶意类没有被调用。令人沮丧

    尽管我找到了解决方案,但我可以做哪些步骤来调试类似的东西还是很有趣的?或者,是否有关于如何在低级别创建事件的文档