2016-05-27 4 views
1

Я разрабатываю приложение Java/Swing, и я делаю свою собственную обработку для ключевых событий, используя KeyListener на моем JFrame.Отключить повторение ключа в Swing

Моя проблема заключается в том, что функция повторения клавиш ОС вызывает несколько событий keyPressed, когда я удерживаю клавишу, когда хочу получить ее только.

Одним из решений было бы сохранить состояния ключей в массиве и принимать только событие, если состояние изменяется.

private boolean keysDown[] = new boolean[0x10000]; 
public void keyPressed(KeyEvent e) { 
    int key = e.getKeyCode(); 
    if (0 <= key && key <= 0xFFFF) { 
     if (keysDown[key]) return; 
     keysDown[key] = true; 
    } 
    // ... 
} 
public void keyReleased(KeyEvent e) { 
    int key = e.getKeyCode(); 
    if (0 <= key && key <= 0xFFFF) { 
     if (!keysDown[key]) return; 
     keysDown[key] = false; 
    } 
    // ... 
} 

Это работает, но очень неуклюж, и в то время как я, кажется, только найти коды клавиш в диапазоне от 0 до 2 -1, я не уверен, что те, за пределами этого диапазона может существовать. (getKeyCode() возвращает int.) Еще одна проблема заключается в том, что нажатие клавиши, отпускание ее в другом окне и повторное нажатие на нее в моем приложении не регистрируют событие.

Итак, есть ли лучший способ либо

  • отключить клавишу повтора в моем приложении или
  • обнаружить повторяющиеся события надежно?
+0

Замените ваш логический массив 'HashSet ' или 'TreeSet '. Повтор ключа - это функция ОС, поэтому нет возможности отключить его, только учетная запись. – VGR

+0

@VGR Я закончил тем самым, с помощью 'WindowFocusListener', чтобы очистить нажатые клавиши от потери фокуса. Опубликуйте это как ответ, я пойду дальше и приму это. – Pietu1998

ответ

3

Замените логическую массив на или TreeSet<Integer>. Повтор ключа - это функция ОС, поэтому нет возможности отключить его, только учетная запись.