Возможно, ваша ОС не запускает события keyReleased
, а только события keyPressed
и keyTyped
или какую-либо другую комбинацию, поэтому сначала проверьте это.Возможно, вам просто нужно проверить наличие keyTyped
событий вместо keyReleased
, и вы с этим покончите.
Краткий ответ:
Используйте bitmask или массив для отслеживания того, какие клавиши в данный момент находятся в «нажатом» состоянии, а затем используйте их для запуска событий.То есть не используйте события Swing напрямую для запуска ответов в вашем приложении - вам нужен дополнительный слой, который по существу хранит состояние клавиатуры, и из этого состояния выполняет соответствующие действия.
Естьтакже доступны методы ( см. в конце этого учебника - «isAltDown», «isCtrlDown» и т. д. ), чтобы проверить, нажимаются ли клавиши-модификаторы при получении события, такого как нажатие клавиши «Пробел».
Длинный ответ:
Вы правы, что события запускаются при нажатии и отпускании клавиш.Это должно работать таким образом, чтобы вы могли поддерживать приложения, которые должны обрабатывать эти события отдельно, а не вместе.Одним из примеров (хотя и не единственным) являются видеоигры на ПК, где вы можете одновременно нажимать несколько букв / клавиш-модификаторов (например, A
для перехода влево и W
для перехода вперед) иигра должна рассматривать эти два события как отдельные входы, а не как композитные входы, в результате чего ваше движение будет идти вперед-влево.
Итак, что вы в основном хотите сделать, если вам нужно иметь дело с композитными входами,Это простой массив действий, на которые должно реагировать ваше приложение, и связанные с ними привязки клавиш (неважно, однозначные или многоключевые).Когда клавиша нажата, вы в основном включаете флаг для этой клавиши, который говорит, что она в данный момент «нажата», и очищаете флаг, когда она отпущена.
Затем, чтобы вызвать события, вы просто проверяете все клавиши, которыенажимаются (путем проверки, какие клавиши «флажки» активны), и если нажата комбинация клавиш определенного события, событие запускается.
Если у вас менее 32 клавиш, которые запускают события, то вы можетена самом деле это делается с битовой маской и 32-битным int
значением, а не массивом.На самом деле, сделать это намного проще, если вы можете.Если вам нужно до 64 ключей, сделайте то же самое с long
.Если у вас очень мало клавиш, запускающих события (например, 8 или меньше), вы можете использовать 8-битный тип short
.