Как различить сдвиг влево / вправо, Ctrl, Alt и клавиши ввода в JavaFX?

Как контроллер JavaFX 8 может определить, находится ли клавиша Shift, Ctrl, Alt или Enter в левой или правой части клавиатуры?

getKeyLocation() метод в java.awt.event.KeyEvent не существует для javafx.scene.input.KeyEvent класс к сожалению.

Я также пытался проверить event.location в JavaScript, перехватывая window.onkeydown, но в отличие от V8 или других JS-движков, библиотека Nashorn, похоже, не различает их и возвращает DOM_KEY_LOCATION_STANDARD независимо от того, где находится ключ.

Поскольку общий захват ключа кажется в значительной степени нарушенным (несоответствия в KeyEvent::getCode / keyText методы), я начинаю думать, что внешняя библиотека будет необходима. Есть ли решение в библиотеке JavaFX (или Java), и если нет, облегченная библиотека, которая может предлагать одинаковые функции на разных платформах (Windows, Linux и Mac OS)?

Заранее спасибо!

Обновить

Пробовал с компонентом JavaFX + awt (см. Предложение ниже), но не будет работать, так как кажется, что JavaFX предоставляет и переводит события - неправильно.

Пробовал с JNativeHook (они недавно переехали), он почти квалифицируется как обходной путь, но не распознает некоторые ключи, имеет неточное время и немного неудобен в реализации, тем более что я не могу скомпилировать нативный код для всех платформ. Условия лицензирования также немного запутаны (GPL для стабильной версии, что в моем случае не вариант, возможно, переход на LGPL...).

2 ответа

Насколько мне известно, в настоящее время нет API для определения того, какая физическая клавиша была нажата в JavaFX. Трудно понять, как сторонняя библиотека могла бы реализовать это, поскольку ей пришлось бы перехватывать низкоуровневую реализацию JavaFX таким образом, который на самом деле не был бы доступен для такого кода.

Если это важно для вас, я бы порекомендовал подать запрос на функцию на https://javafx-jira.kenai.com/

Я бы посоветовал просто использовать java.awt, потому что он отлично работает для того, что вам нужно. Он довольно легкий и, что более важно, он поддерживает Windows, Linux и Mac OS. Вы можете найти простой пример здесь.

Я думаю, что самым полезным будет тот факт, что он обеспечивает различие между правым и левым с KEY_LOCATION_RIGHT или же KEY_LOCATION_LEFT как упомянуто в документах, найденных здесь

Например: getKeyCode может вернуться VK_SHIFT а потом getKeyLocation может вернуться KEY_LOCATION_RIGHT что, очевидно, указывает на то, что была нажата правая клавиша Shift, и в этот момент вы можете выполнить все, что вам нужно.

Удачи!

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