Как остановить повторяющиеся события keyPressed () / keyReleased () в Swing - PullRequest
13 голосов
/ 15 ноября 2009

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

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

Спасибо.

Ответы [ 5 ]

14 голосов
/ 15 ноября 2009

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

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

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

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

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

2 голосов
/ 06 мая 2010

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

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

1 голос
/ 17 ноября 2011

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

1 голос
/ 28 декабря 2009

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

0 голосов
/ 04 мая 2018

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

...