Подтвердить что ты не робот

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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