2013-11-29 5 views
1

У меня есть приложение Java со многими текстовыми полями, где я могу ввести, например, é, нажав `, а затем e. Это поведение, известное из многих приложений.Как узнать, кто разрушает событие KEY_TYPED?

Теперь после конкретной операции пользователя (начиная с конкретного модуля приложения) все текстовые поля в приложении не смогут ввести é.

Вот что я сделал:

Происходит ли это на 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, но проблема все еще существует на Windows вне Eclipse и не встречается в Linux или внутри Eclipse.

Так что же я ожидаю? Мне нужен кто-то, кто может сказать, что я должен искать, чтобы найти причину этой странной проблемы. Любая документация, которую я нашел о KeyEvents, слишком много для новичков, мне нужна документация для точки, где я сейчас. Кто создает события KEY_TYPED? Или кто несет ответственность за манипуляции с неправильным событием?

Спасибо заранее!

ответ

1

Хорошо, я нашел причину проблемы просто удаленной отладкой и степпингами бросил все этапы, по которым были пройдены события. Это раздражает, потому что нет решения, как анализировать следующую проблему такого рода.

Проблема в моем случае заключалась в том, что внутри вредоносного модуля был класс KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(..) и KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(..), чтобы перенаправлять события на его объекты, чтобы реагировать на KeyEvents, даже если они произошли в дочерних компонентах.

Проблема в том, что этот диспетчер и процессор называются e.consume(), которые могут повлиять на создание события KEY_TYPED. Факт в том, что при удалении потребления события все работает.

Внутри затмения ничего не случилось, потому что некоторые классы не были в пути к классам, и поэтому после того, как поиск не удался, вредоносный класс не был вызван в этот момент. Разочарование.

Несмотря на то, что я нашел решение, было бы интересно, какие шаги я мог бы сделать, чтобы отлаживать что-то подобное?Или есть какая-либо документация о том, как события создаются на низком уровне?

Смежные вопросы