Это немного сложно и запутанно, и вы запутались.
Нет ключевых событий в верхнем и нижнем регистре. Есть только события «A / a», и вы можете иметь или не иметь модификатор SHIFT.
Просто так получилось, что VK_A-VK_Z идентичны ASCII от 'A' до 'Z', но не так, что от 'a' до 'z'.
Когда вы повторно отправляете 'a' (ASCII 0x61, aka 97), который вы получили от getKeyChar () , вы фактически отправляете VK_NUMPAD1, поэтому вы получаете '1 ».
JavaDoc для getKeyChar говорит следующее:
getKeyChar () Возвращает символ, связанный с ключом в этом
событие. Например, событие KEY_TYPED для shift + "a" возвращает
значение для "A"
Так что, когда вы пытаетесь с 'A', вы получаете VK_A, и все работает, как вы ожидаете. Но когда вы просто набираете «а», вы получаете 0x61, а это не то, что вам нужно.
Насколько я могу судить, изменение getKeyChar () на getKeyCode () решит вашу проблему.
Это сказало, что я не буду баловаться с KEY_PRESS / KEY_RELEASED. Я бы просто перехватил KEY_TYPED и "Robot" оттуда.