Как я могу создать свои собственные объекты KeyEvent
, которые идеально (или очень близко) соответствуют тем, которые я получал бы от KeyListener
, когда конечный пользователь что-то набирает?
Например, у меня есть раскладка клавиатуры ISO в Великобритании и для ввода символа "
я нажимаю Shift+2
. Если я записываю это на JFrame
с KeyListener
, я получаю следующие события:
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=16,keyText=Shift,keyChar=Undefined keyChar,modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_LEFT,rawCode=16,primaryLevelUnicode=0,scancode=42,extendedKeyCode=0x10] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=50,keyText=2,keyChar='"',modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_STANDARD,rawCode=50,primaryLevelUnicode=50,scancode=3,extendedKeyCode=0x32] on frame0
java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='"',modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on frame0
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=16,keyText=Shift,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=16,primaryLevelUnicode=0,scancode=42,extendedKeyCode=0x10] on frame0
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=50,keyText=2,keyChar='"',keyLocation=KEY_LOCATION_STANDARD,rawCode=50,primaryLevelUnicode=50,scancode=3,extendedKeyCode=0x32] on frame0
Я хочу создать метод, который я бы дал "
как параметр char, и он вернет массив KeyEvents, как указано выше.
Мои проблемы:
-
В событиях
KEY_PRESSED
иKEY_RELEASED
keyChar='"'
представляет символ, который был нажат ("
), однакоkeyCode=50
относится к "несмещенному" значению ASCII (aka2
). Мне нужно знать, как получить это несмещенное значение только из символа"
. -
Это не сдвинутое значение также будет отличаться для разных раскладок клавиатуры. Например, для US ANSI layout требуется
Shift+'
ввести ключ"
, что означает, чтоkeyCode
будет 39, а не 50. -
На некоторых раскладках клавиатуры клавиша сдвига требуется для ввода ключа, но не для других. Например, для символа
#
требуетсяShift+3
на клавиатурах US ANSI, но не требует нажатия на клавиши UK ISO. Мне нужно знать, должен ли я имитировать события прессования/выпуска сдвига и предоставить модификатор сдвига.
Любое понимание того, как решить эти проблемы, будет оценено по достоинству. Я также должен отметить, что использование класса Robot
не может быть использовано в моей ситуации.