Я разрабатываю приложение Java/Swing, и я делаю свою собственную обработку для ключевых событий, используя KeyListener
на моем JFrame
.Отключить повторение ключа в Swing
Моя проблема заключается в том, что функция повторения клавиш ОС вызывает несколько событий keyPressed
, когда я удерживаю клавишу, когда хочу получить ее только.
Одним из решений было бы сохранить состояния ключей в массиве и принимать только событие, если состояние изменяется.
private boolean keysDown[] = new boolean[0x10000];
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (0 <= key && key <= 0xFFFF) {
if (keysDown[key]) return;
keysDown[key] = true;
}
// ...
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (0 <= key && key <= 0xFFFF) {
if (!keysDown[key]) return;
keysDown[key] = false;
}
// ...
}
Это работает, но очень неуклюж, и в то время как я, кажется, только найти коды клавиш в диапазоне от 0 до 2 -1, я не уверен, что те, за пределами этого диапазона может существовать. (getKeyCode()
возвращает int
.) Еще одна проблема заключается в том, что нажатие клавиши, отпускание ее в другом окне и повторное нажатие на нее в моем приложении не регистрируют событие.
Итак, есть ли лучший способ либо
- отключить клавишу повтора в моем приложении или
- обнаружить повторяющиеся события надежно?
Замените ваш логический массив 'HashSet' или 'TreeSet '. Повтор ключа - это функция ОС, поэтому нет возможности отключить его, только учетная запись. –
VGR
@VGR Я закончил тем самым, с помощью 'WindowFocusListener', чтобы очистить нажатые клавиши от потери фокуса. Опубликуйте это как ответ, я пойду дальше и приму это. – Pietu1998