Как остановить повторяющиеся события keyPressed() / keyReleased() в Swing

Таким образом, проблема, которая у меня возникает, заключается в ошибке, возникающей только в Linux. Я пытаюсь записать свинг-приложение, когда нажата клавиша, а затем определить, когда она отпущена. Теперь это не должно быть проблемой, потому что KeyListener должен обрабатывать это для меня.

Проблема в том, что когда я удерживаю клавишу нажатой, я получаю много повторяющихся событий keyPressed()/keyReleased() вместо одного нажатия клавиши (). У кого-нибудь есть решение или обходной путь, позволяющий узнать, когда ключ действительно будет выпущен в Linux?

Спасибо.

5 ответов

Решение

Таким образом, проблема, которая у меня возникла, кажется, ошибка, которая возникает только в Linux

Да, это проблема Linux.

В Windows, когда клавиша удерживается нажатой, вы получаете несколько событий KeyPressed, но только одно событие KeyReleased.

Этот вопрос часто задают, и я никогда не видел хорошего решения.

Но я думаю, что основой решения является использование таймера. Когда клавиша нажата, вы запускаете таймер. Когда вы получаете еще одну клавишу, вы перезапускаете таймер. Поэтому, пока интервал таймера больше, чем частота повторения клавиатуры, таймер будет постоянно сбрасываться при удерживании клавиши. Когда keyPresses перестают генерироваться, таймер сработает, поэтому вы предполагаете, что ключ был отпущен. Это означает, что у вас будет задержка при обработке keyReleased.

Этот вопрос продублирован здесь.

Вот хак, реализованный в виде AWTEventListener, который можно установить в начале приложения.

Вот ошибка от Sun (включая примеры обходных путей): http://bugs.sun.com/view_bug.do?bug_id=4153069

Вы можете найти довольно хороший обходной путь здесь.

Используйте реализацию KeyEventDispatcher, с ее помощью вы будете правильно связывать клавиши.

Другие вопросы по тегам