Символы KeyEvent

У меня есть вопрос о KeyListener. Когда я получу KeyEvent и сделаю getKeyChar(), я попытаюсь сравнить со звездочкой и *, и я собирался использовать одно из определений KeyEvent.VK_, которое работает для многих ключей.

Но для этого конкретного ключа и некоторых других значения не совпадают.

* getKeyChar() вернет 0x2a, а getKeyCode() вернет 0x38. Определение для 0x38 — это VK_8, а не VK_ASTERISK, которое равно 0x97.

Почему одни коды клавиш совпадают, а другие нет. Большинство, ага. Если я просто сравниваю персонажей, это работает( == '*'), но я не уверен, что это лучшее решение?

Спасибо за всю помощь!!!


person user565660    schedule 27.02.2012    source источник


Ответы (3)


Ладно, ты что-то не так понял.

Ключи есть ключи, а символы есть символы. Символы являются результатом нажатия клавиш, и одна и та же клавиша может отображать разные символы в зависимости от обстоятельств (комбинаций клавиш, таких как Alt, Control, Shift и т. д.). ).

Таким образом, VK_8 код клавиши означает клавишу, которая может создавать символы 8, * и, возможно, другие, в зависимости от локализации клавиатуры.

И * выделенная клавиша на цифровой клавиатуре — VK_MULTIPLY — она может создавать только один символ * (насколько мне известно).

Вероятно, вас должна волновать не клавиша, которую нажал пользователь, а символ, созданный этим действием пользователя.

Эту информацию вы можете получить с помощью getKeyChar(), но обратите внимание, что если пользователь нажимает комбинацию Shift 8 для получения *, на самом деле это две клавиши (Shift и 8), и вы получите два события, причем первое (для Shift) выдаст нечитаемый символ.

person Oleg Mikheev    schedule 27.02.2012
comment
Последнее предложение, похоже, сработало для меня. Я получаю 0xFFFF, который является CHAR_UNDEFIEND для смены, которую я просто игнорирую, а затем я делаю getKeyChar() в следующий раз, когда я делаю getKeyChar() == '*', и это, кажется, работает. Спасибо!! - person user565660; 27.02.2012

зависит от JComponent

если вы хотите определить из JTextComponent, используйте DocumentListener, если вы хотите изменить последовательность символов, используйте Фильтр документов

в противном случае посмотрите KeyBindings, потому что KeyListener предназначен для AWT Components

person mKorbel    schedule 27.02.2012
comment
Это просто JTextField, который я использую. Есть ли что-то неправильное в том, чтобы оставить его как getKetChar() =='*' ? Разве это не всегда будет работать? - person user565660; 27.02.2012
comment
для JTextField используйте только DocumentListener/DocumentFilter, другого правильного пути нет - person mKorbel; 27.02.2012

  1. KeyEvent.VK_ASTERISK — это константа, зарезервированная для (виртуальной) клавиши клавиатуры, отмеченной *. Он не обязательно должен совпадать с символом, который создается, когда кто-то нажимает клавишу.

    Если вы хотите использовать константы VK, вы должны прослушивать события нажатия и нажатия клавиш и использовать метод KeyEvent.getKeyCode(). Если вы хотите использовать символы, которые вы прослушиваете для событий, типизированных ключом, и используйте метод KeyEvent.getKeyChar().

    Некоторые коды клавиш могут совпадать с символом только потому, что его проще определить таким образом; нет никакой реальной необходимости делать это таким образом.

  2. Вы говорите, что получили ВК_8 от getKeyCode за то, что набрали звездочку. Вы нажимали настоящую клавишу со звездочкой или вам приходилось набирать Shift-8?

person Joni    schedule 27.02.2012
comment
когда я нажимаю * на цифровой клавиатуре, я получаю VK_MULTIPLY, а не VK_ASTERISK - person Oleg Mikheev; 27.02.2012