2014-07-24 5 views
-1

Я заметил, что я получаю два разных keyCode для тех же Char. Вот небольшой эксперимент:Проблема с KeyEvent и KeyStroke

package main; 

import com.sun.javafx.scene.control.Keystroke; 

import javax.swing.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class Keystroketest { 
    public static void main(String[] args) { 
     final KeyStroke ks = KeyStroke.getKeyStroke('e', 0); 
     System.out.println(ks.getKeyCode()); 

     JFrame f = new JFrame(); 
     JTextField jtf = new JTextField(""); 
     f.setBounds(300, 300, 100, 60); 
     f.add(jtf); 
     f.setVisible(true); 


     jtf.addKeyListener(new KeyListener() { 
      @Override 
      public void keyTyped(KeyEvent keyEvent) { 
      } 

      @Override 
      public void keyPressed(KeyEvent keyEvent) { 
      } 

      @Override 
      public void keyReleased(KeyEvent keyEvent) { 
       System.out.println(keyEvent.getKeyCode()); 
       if (keyEvent.getKeyCode() == ks.getKeyCode()) { 
        System.out.println("letters are similar"); 
       } else { 
        System.out.println("letters aren't similar"); 
       } 
      } 
     }); 
    } 
} 

Если я печатаю в textField букву «е», так что возвращает другой KeyCode для одной и той же буквы, когда я анализирую его.

В чем причина? И как я могу проверить, является ли введенная вами буква/char такой же, как в определенном символе, указанном в коде, как указано выше ...?

Так что всякий раз, когда я проверяю KeyCode, я набрал, java думает, что я не набирал ту же букву. Но это неправильно, я думаю.

+1

Вы действительно не должны использовать «KeyListener» в текстовых полях, и если вы заинтересованы в фильтрации содержимого, вы должны использовать 'DocumentFilter' – MadProgrammer

+0

- безгражданный, что это значит? – Synoon

+1

Это означает, что виртуальный ключ не имеет никакой информации, чтобы отличать его от 'E' или' e' – MadProgrammer

ответ

0

Вы используете неправильный метод getKeyStroke:

final KeyStroke ks = KeyStroke.getKeyStroke('e', 0); 

Вызовы getKeyStroke (интермедиат KeyCode, Int модификаторов), так как "символ" интерпретируется как 16 битное значение, которое может быть AutoCast к 32-битной Int стоимость. Автобоксирование происходит только в том случае, если нет подходящего метода.

использование либо

final KeyStroke ks = KeyStroke.getKeyStroke(Character.valueOf('e'), 0); 

или:

final KeyStroke ks = KeyStroke.getKeyStroke('e'); 

И помните, для собственного API: попытаться обнаружить такие столкновения при перегрузке. ;-)

Кроме того, как MadProgrammer указал, что не решит вашу проблему.

Вы пытались использовать keyEvent.getKeyChar() вместо этого?

+0

Хотя ваши наблюдения верны 'KeyStroke.getKeyStroke ('e')' или 'KeyStroke.getKeyStroke (Character.valueOf ('e'), 0)' приводят к «коду ключа» '0', а не' VK_E' или '69' ... – MadProgrammer