Как различить сдвиг влево / вправо, 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, и в этот момент вы можете выполнить все, что вам нужно.
Удачи!