Как остановить повторяющиеся события keyPressed() / keyReleased() в Swing
Таким образом, проблема, которая у меня возникает, заключается в ошибке, возникающей только в Linux. Я пытаюсь записать свинг-приложение, когда нажата клавиша, а затем определить, когда она отпущена. Теперь это не должно быть проблемой, потому что KeyListener должен обрабатывать это для меня.
Проблема в том, что когда я удерживаю клавишу нажатой, я получаю много повторяющихся событий keyPressed()/keyReleased() вместо одного нажатия клавиши (). У кого-нибудь есть решение или обходной путь, позволяющий узнать, когда ключ действительно будет выпущен в Linux?
Спасибо.
5 ответов
Таким образом, проблема, которая у меня возникла, кажется, ошибка, которая возникает только в Linux
Да, это проблема Linux.
В Windows, когда клавиша удерживается нажатой, вы получаете несколько событий KeyPressed, но только одно событие KeyReleased.
Этот вопрос часто задают, и я никогда не видел хорошего решения.
Но я думаю, что основой решения является использование таймера. Когда клавиша нажата, вы запускаете таймер. Когда вы получаете еще одну клавишу, вы перезапускаете таймер. Поэтому, пока интервал таймера больше, чем частота повторения клавиатуры, таймер будет постоянно сбрасываться при удерживании клавиши. Когда keyPresses перестают генерироваться, таймер сработает, поэтому вы предполагаете, что ключ был отпущен. Это означает, что у вас будет задержка при обработке keyReleased.
Вот ошибка от Sun (включая примеры обходных путей): http://bugs.sun.com/view_bug.do?bug_id=4153069
Используйте реализацию KeyEventDispatcher, с ее помощью вы будете правильно связывать клавиши.