Прочтите каждое нажатие клавиши только один раз с JNativeHook

В моей программе я хочу иметь текстовое поле, которое будет содержать текущие клавиши, нажатые пользователем. Я могу сделать это с помощью JNativeHook, но в настоящее время проблема заключается в том, что JNativeHook регистрирует тонны нажатий клавиш, когда он удерживается. Есть ли способ игнорировать удержание клавиш? Я хотел бы просто добавить в текстовое поле все ключи, которые в настоящее время удерживаются, не переполняя его дубликатами.

Вот соответствующая часть моего кода: (Это в моем основном классе, который расширяет Application и реализует NativeKeyListener)

@Override
public void nativeKeyPressed(NativeKeyEvent e) {
    System.out.print(NativeKeyEvent.getKeyText(e.getKeyCode()) + " + ");

    if (e.getKeyText(e.getKeyCode()) == "F6")
        System.out.println("F6");


}
@Override
public void nativeKeyReleased(NativeKeyEvent e) {
    try {
        GlobalScreen.unregisterNativeHook();
    } catch (NativeHookException ex) {}
}
@Override
public void nativeKeyTyped(NativeKeyEvent e) {

}

Все это работает нормально, но если я удерживаю ключ, он будет спамить этот ключевой код в консоли. Могу я это остановить?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
249
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто переместите свой код на nativeKeyTyped. Он срабатывает только один раз при каждом нажатии и отпускании клавиши.

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

Если вам нужен больший контроль, вы можете просто добавить карту. В этом примере используется хэш-карта для записи, если клавиша нажата, и сколько обновлений нужно дождаться, пока она снова не сработает. Я не особо смотрел на api, поэтому не удивлюсь, если вызовы некоторых функций будут введены неправильно.

private Map<Integer, Integer> keysHeld = new Hashmap();


@Override
public void nativeKeyPressed(NativeKeyEvent e) {
    //When the countdown gets to 0, do a key update
    if (keysHeld.getOrDefault(e.keyCode(), 0) <= 0) {
        //Do whatever you want to do.

        //Set the countdown again, so it can be activated again after a reasonable amount of time.
        keysHeld.put(e.keyCode(), 50);
    }

    //Decrease the countdown by 1 each update until it triggers or is released.
    keysHeld.put(e.keyCode(), e.getOrDefault(e.keyCode(), 50) - 1);
}

 @Override
 public void nativeKeyReleased(NativeKeyEvent e) {
     //Reset countdown when key is released.
     keysHeld.put(e.keyCode(), 0);
}

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