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

1

Как контроллер 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...).

Теги:
javafx
javafx-8
keyboard
keyboard-events

2 ответа

2

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

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

  • 2
    В то же время я нашел JNativeHook, и я достаточно отчаялся, чтобы попробовать. Спасибо за ссылку, я, вероятно, должен сообщить об ошибочном и неполном поведении системы ключевых событий.
  • 0
    Пожалуйста, отправьте отчет об ошибке. Я получил хорошие ответы от команды JavaFX на сообщения об ошибках и запросы функций.
Показать ещё 3 комментария
1

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

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

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

Удачи!

  • 0
    Это была одна идея, хотя поведение в JavaFX не поддерживает getKeyLocation, возвращаемые значения всегда KEY_LOCATION_UNKNOWN . Они действительно хорошо поработали с Java 8;) Кроме того, я не очень хотел смешивать JavaFX с Awt - можно было бы обойти это, если бы это работало, но, очевидно, это не так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню