Странное поведение событий клавиатуры в Java - PullRequest
0 голосов
/ 11 октября 2011

Когда я нажимаю кнопку "Delete" на клавиатуре, программа получает три события - KEY_PRESSED, KEY_TYPED и KEY_RELEASED.Проблема в том, что в KEY_PRESSED и KEY_RELEASED параметр "keyCode" установлен, но в KEY_TYPED это не так (на самом деле никакой значимой информации в этом событии нет).С ключом F5 это еще смешнее - KEY_PRESSED и KEY_RELEASED зарегистрированы, но KEY_TYPED никогда не происходит.

Слушатель был добавлен через Toolkit.getDefaultToolkit().addAWTEventListener().Использование JDK 6.26.

В чем может быть моя проблема?

РЕДАКТИРОВАТЬ: Вот события, которые происходят при нажатии клавиши Delete:

 java.awt.event.KeyEvent[KEY_PRESSED,keyCode=127,keyText=Delete,keyChar=Delete,keyLocation=KEY_LOCATION_STANDARD,rawCode=119,primaryLevelUnicode=127,scancode=0] on javax.swing.JButton[,0,0,61x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth.SynthBorder@50f38cf0,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=javax.swing.ImageIcon@6ae2d0b2,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=SVG,defaultCapable=false]
 java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar=Delete,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=127,scancode=0] on javax.swing.JButton[,0,0,61x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth.SynthBorder@50f38cf0,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=javax.swing.ImageIcon@6ae2d0b2,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=SVG,defaultCapable=false]
 java.awt.event.KeyEvent[KEY_RELEASED,keyCode=127,keyText=Delete,keyChar=Delete,keyLocation=KEY_LOCATION_STANDARD,rawCode=119,primaryLevelUnicode=127,scancode=0] on javax.swing.JButton[,0,0,61x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth.SynthBorder@50f38cf0,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=javax.swing.ImageIcon@6ae2d0b2,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=SVG,defaultCapable=false]

Ответы [ 3 ]

5 голосов
/ 11 октября 2011
  • лучше было бы реализовать KeyBindings

  • часть клавиатуры зарезервирована Клавиши для встроенной функциональности JComponent, больше информации от @camickrs UIManager по умолчанию

  • зависит от причины (причин), по которой вам потребовался имплантат KeyListener, потому что для различных JComponent существует множество других прослушивателей, которые должны фильтроваться или регистрироватьсяизменения текста внутри

  • некоторые модели JComponent генерировали события из мыши и клавиатуры

1 голос
/ 20 июля 2012

События, вводимые ключом ВСЕГДА генерируют «0» в качестве кода ключа.Вместо этого найдите метод getKeyChar () или (как было предложено) вместо этого прослушивайте keyReleased ().getKeyChar (): http://goo.gl/ajH03

1 голос
/ 11 октября 2011

Из JavaDoc The "key typed" event. This event is generated when a character is entered. In the simplest case, it is produced by a single key press. Often, however, characters are produced by series of key presses, and the mapping from key pressed events to key typed events may be many-to-one or many-to-many.

Вы пытаетесь получить клавишу F5, которая, вероятно, не зарегистрирована как вводимый символ. Используя KEY_RELEASED, вы последовательно получаете результат, который ищете, а API работает так, как ожидалось.

...