2013-06-13 3 views
0

Я, имеющими проблемы с Java KeyListener при добавлении добавления другого JPanel с 5 JLabels, я искал этот сайт, и большинство решений этой проблемы включают переход от KeyListener к KeyBindings. Это не будет работать для меня, потому что мне нужно точно знать, когда нажата клавиша, выпущена и удерживается. Насколько мне известно, KeyBindings не предоставляет все это.Java KeyListener с несколько JPanel

Я пытался использовать

this.requestFocus(); 

после создания нового JPanel, но он не работает, однако, когда я использую ту же линию внутри paintComponent(), она работает. Что подводит меня к моим вопросам: как это отражается на производительности? Мой paintComponent() называется около 60 раз/сек. Есть ли способ позвонить ему один раз и все еще работать? Я вижу, что requestDefaultFocus() от JComponent устарел ...

Я также попытался добавить тот же KeyListener ко второй JPanel, но это не помогло. Я предполагаю, что один из JLabels - это тот, кто получает фокус?

ответ

2

Это не работает для меня, потому что мне нужно точно знать, когда нажата клавиша, отпущена и удерживается. Насколько мне известно, KeyBindings не предоставляет все эти возможности.

Да, так оно и есть. У вас есть действие для «нажатых» и «выпущенных». Нет такого действия, как «сдерживание» (даже для KeyListener), вы просто получаете несколько генерируемых событий.

this.requestFocus(); 

Это не тот метод, который можно использовать для предварительного запроса на компонент. Прочтите API для этого метода, и он расскажет вам о правильном методе использования.

Однако, когда я использую ту же линию внутри paintComponent(), он работает.

Это связано с тем, что вы не можете запросить фокусировку на компоненте до тех пор, пока не будет реализован кадр, а это значит, что вы вызывали пакет() или setVisible() в кадре.

Есть ли способ позвонить ему один раз и все еще работать?

См. RequestFocusListener класс в Dialog Focus.

Правильное решение - использовать привязки клавиш, поэтому вам не нужно использовать эти работы.

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