2014-12-22 7 views
2

я добавил событие в моей JTextFieldKeyListener на JTextField не работает

jTextField1.addKeyListener(new java.awt.event.KeyAdapter() { 
      public void keyTyped(java.awt.event.KeyEvent evt) { 
       jTextField1KeyTyped(evt); 
      } 
     }); 

а вот вторая часть моего кода (отвечает за обработку кнопок клавиатуры):

private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {          
     switch (evt.getKeyCode()) { 
       case KeyEvent.VK_1: 
        print(one); 
        System.out.println("1"); 
        break; 
       case KeyEvent.VK_2: 
        print(two); 
        System.out.println("2"); 
        break; 
       case KeyEvent.VK_3: 
        print(three); 
        System.out.println("3"); 
        break; 
       case KeyEvent.VK_4: 
        print(four); 
        System.out.println("4"); 
        break; 
       case KeyEvent.VK_5: 
        print(five); 
        System.out.println("5"); 
        break; 
       case KeyEvent.VK_6: 
        print(six); 
        System.out.println("6"); 
        break; 
       case KeyEvent.VK_7: 
        print(seven); 
        System.out.println("7"); 
        break; 
       case KeyEvent.VK_8: 
        print(eight); 
        System.out.println("8"); 
        break; 
       case KeyEvent.VK_9: 
        print(nine); 
        System.out.println("9"); 
        break; 
       case KeyEvent.VK_0: 
        print(zero); 
        System.out.println("0"); 
        break; 
      } 
    }     

Но это не работает. Когда у меня какая-то кнопка - ничего не происходит.

+2

Попробуйте использовать инструкцию по умолчанию, чтобы узнать, выполняется ли оператор switch. – FlyingPiMonster

+0

Просьба предоставить более полный контекст того, что находится в этом текстовом поле, и что вы делаете с ним. В частности, имеет ли он фокус? – Vitruvius

+1

Вы пытались отладить свой код и посмотреть, что такое фактическое значение evt.getKeyCode()? – Scadge

ответ

6

Настоятельно настоятельно призываю вас изменить свою игру. Вы не должны использовать KeyListener внутри JTextField, поскольку это нарушает работу JTextField. Используйте DocumentListener или DocumentFilter или один из других гораздо лучших вариантов. Поскольку вы не ограничиваете ввод данных, перейдите к DocumentListener, прикрепленному к документу JTextField, с помощью addDcoumentListener (...).

т.е.,

jTextField1.getDocument().addDocumentListener(new DocumentListener() { 

    public void keyTyped(java.awt.event.KeyEvent evt) { 

     void insertUpdate(DocumentEvent e) { 
      // ... code to check document change here 
     } 

     void removeUpdate(DocumentEvent e){ 
      // ... code to check document change here 
     } 

     void changedUpdate(DocumentEvent e){ 
      // ... code to check document change here 
     } 

    } 

}); 

Edit: если вы желаете, чтобы захватить номер нажатий клавиш для калькулятора, то не используйте это либо. Скорее используйте привязки клавиш.

+0

Я сожалею, что у меня есть только один голос, чтобы дать ... – MadProgrammer

+0

Хорошо, я посмотрю в DocumentListener и DocumentFilter, но сначала я попытаюсь что-то сделать с привязкой клавиш. –

+2

@ MichałGwóźdź: ознакомьтесь с [учебником] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html). –

1

Ну, вы должны использовать DocumentListener или ChangeListener, также FocusListener может быть опцией keyListener выполняет задание, но при использовании его возникают проблемы с фокусом, если вы хотите избежать проблем с фокусом, используя KeyBindings или вы можете попытаться явно вызвать метод grabFocus() для конкретного компонента, его ключевой идентификатор при регистрации в компоненте нуждается в том, чтобы этот компонент был в фокусе.

+0

Связывание клавиш может быть слишком ограничительным и было бы нецелесообразным по тем же причинам, что и KeyListener для текстового компонента. Лучшим вариантом, как уже было предложено HovercraftFullOfEels, является «DocumentListener», поскольку это будет уведомлять вас, когда документ будет изменен либо пользователем, набравшим что-то, и вставка чего-то в поле была программно модифицирована ... – MadProgrammer

+0

Тогда слушатель по переменам может хорошо выполнять работу для всех видов изменений. –

+0

Но 'JTextField' не поддерживает' ChangeListener', 'DocumentListener' - лучший выбор ... – MadProgrammer

Смежные вопросы