2013-04-18 7 views
2

Я пытаюсь сделать что-то вроде текстового поля hotkey. Пользовательские нажатия F11/Caps lock/любая клавиша и появляется в коробке. Я сделал это так:Нажата кнопка как горячая клавиша

@Override 
public void keyPressed(KeyEvent e) { 
    textField_1.setText(String.valueOf(e.getKeyChar())); 
} 

, но он не работает для Fs, крышки блокировки и т.д. (что очевидно, потому что это не те символы). Как я могу справиться с этой проблемой?

ответ

2

Вы, вероятно, хотите использовать e.getKeyText() вместо e.getKeyChar(), который будет возвращать F1 если F1 ключ presed. Вот описание API:

getKeyText

общественности статической строки getKeyText (интермедиат KEYCODE)

Возвращает строку, описывающую KEYCODE, такие как "HOME", "F1" или «А». Эти строки можно локализовать, изменив файл awt.properties.

Возвращает: строка, содержащая текстовое описание физического ключа, идентифицированного его KEYCODE

- http://docs.oracle.com/javase/6/docs/api/java/awt/event/KeyEvent.html#getKeyText(int)

В качестве альтернативы:

Вы можете также использовать e.getKeyCode что даст вам коды клавиш для различных ключевых событий, определяющих их соответствующие постоянные значения. Например, e.getKeyCode вернет 112 в качестве значения для нажатия клавиши для F1, к которому можно получить доступ по постоянной VK_F1.Ниже приводится API Описание:

getKeyCode

общественного ИНТ getKeyCode()
Возвращает целое число, связанное с KEYCODE клавишу в этом случае.
Возвращает: Целочисленный код для фактического ключа на клавиатура. (Для KEY_TYPED событий, KEYCODE является VK_UNDEFINED.)

- http://docs.oracle.com/javase/6/docs/api/java/awt/event/KeyEvent.html#getKeyCode()

А вот списки для ключевых констант: http://docs.oracle.com/javase/6/docs/api/constant-values.html#java.awt.event.KeyEvent.CHAR_UNDEFINED

+1

Вот и все! Спасибо :-) –

+0

Вы не должны изменять текстовое поле из прослушивателя клавиш, кроме того, что он может вызывать ошибки одновременной модификации, нет никакой гарантии, в каком порядке уведомляются ключевые слушатели, и ключ может быть использован до вас , Гораздо лучше использовать DocumentFilter и KeyBindings - IMHO – MadProgrammer

4

Вы можете использовать:

event.getKeyCode(); 

Но в целом вы, вероятно, следует использовать Key Bindings.

Как Agusti-N состояний в his answer:

Интерфейс KeyListener содержит три метода:

void keyTyped(KeyEvent) 
void keyPressed(KeyEvent) 
void keyReleased(KeyEvent) 

Если вы используете keyPressed и вы используете event.getKeyChar() для проверки введен символ, Это не будет работать. Вы должны использовать getKeyChar() для keyTyped и getKeyCode() для keyPressed и keyReleased. В противном случае вы получите null. Как указано в javadoc.

+0

Не могли бы вы объяснить (или цитируют ссылку), почему он выиграл Работа? – nullpotent

+0

причина просто потому, что это [как они ее закодировали] (http://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyEvent.html#getKeyChar%28%29), ничего в частности, насколько я заинтересован –

+1

Спасибо, я сделаю некоторое исследование о привязках клавиш. –

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