2015-10-06 4 views
-1

У меня есть JTextfield с Keylistener прикрепленного так:KeyListener не стреляя события в JTextField

field.addKeyListener(new KeyAdapter() { 

     @Override 
     public void keyPressed(KeyEvent e) { 
      log.debug("KEY PRESSED"); 
     } 

     @Override 
     public void keyTyped(KeyEvent e) { 
      log.debug("KEY TYPED"); 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      log.debug("KEY RELEASED"); 
     } 
}); 

Но когда я ввожу некоторые ключи я могу видеть, что keyReleased не всегда стрельбы. Я не могу сразу вводить какие-либо ключи, если он не срабатывает, я должен снова щелкнуть по текстовому полю или ввести другой ключ, чтобы получить освобожденное событие (введенный ключ не отображается в текстовом поле). Я ничего не делаю с Keys, никакое событие не будет поглощено. Похоже, что мероприятие становится случайным. То же самое происходит с KeyListener вместо KeyAdapter:

field.addKeyListener(new KeyListener() { 

Я использую Linux 64bit, но это также происходит на Win8 и Win10 64bit. Также пробовали разные клавиатуры и разные компьютеры.

Как я могу правильно запустить мероприятие?

+2

Не используйте 'KeyListener' с текстовые компоненты, вместо этого используйте «DocumentListener» – MadProgrammer

+1

Какие ключи вызывают проблемы? Когда вы зарегистрировали «KeyListener» в текстовом поле, введенный ключ должен находиться в текстовом поле. Например. «TAB» может изменить фокус на следующий компонент. – hotzst

+0

@hotzst Это происходит с любым ключом из a-z, включая числа. –

ответ

0

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

Компоненты Swing используют ключевые привязки для связывания действий с помощью клавиш.

У JTextField уже есть действия по умолчанию, связанные с «клавишами со стрелками». Если вы хотите изменить это поведение, вам нужно создать собственные действия для этих ключей, чтобы заменить действие по умолчанию.

Ознакомьтесь с ключевыми привязками для списка привязок по умолчанию для каждого компонента Swing.

Вы должны создать свое действие за счет расширения TextAction

static class SelectAll extends TextAction 
{ 
    public SelectAll() 
    { 
     super("Select All"); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     JTextComponent component = getFocusedComponent(); 
     component.selectAll(); 
     component.requestFocusInWindow(); 
    } 
} 

Тогда вы могли бы связать это со стрелкой влево вашего текстового поля в с помощью:

Action action = new SelectAll(); 
KeyStroke keyStroke = KeyStroke.getKeyStroke("LEFT"); 
InputMap im = textField.getInputMap(); 
textField.getActionMap().put(im.get(keyStroke), action);