Как контроллер 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
их и возвращает DOM_KEY_LOCATION_STANDARD
независимо от того, где находится ключ.
Так как общий захват клавиш кажется довольно сломанным (несоответствия в KeyEvent::getCode
/keyText
), я начинаю думать, что потребуется внешняя библиотека. Есть ли решение в библиотеке JavaFX (или Java), а если нет, то легкая библиотека, которая может предлагать ту же функциональность на разных платформах (Windows, Linux и Mac OS)?
Заранее спасибо!
Обновить
Пробовал с компонентом JavaFX + awt (см. Предложение ниже), но не работает, поскольку кажется, что JavaFX обеспечивает и переводит события - неправильно.
Пробовал JNativeHook (недавно они переехали), он почти квалифицируется как обход, но не распознает некоторые ключи, имеет неточные сроки и немного неудобен для реализации, тем более, что я не могу скомпилировать собственный код для всех платформ. Условия лицензирования также немного запутаны (GPL для стабильной версии, которая не является вариантом в моем случае, возможно, переместилась на LGPL...).
Насколько мне известно, в настоящее время нет 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
что, очевидно, указывает на то, что нажата правая клавиша переключения, в какой момент вы можете выполнить все, что вам нужно.
Удачи!
KEY_LOCATION_UNKNOWN
. Они действительно хорошо поработали с Java 8;) Кроме того, я не очень хотел смешивать JavaFX с Awt - можно было бы обойти это, если бы это работало, но, очевидно, это не так.