2009-03-20 27 views
8

¿Cómo se obtiene el código VK de un carácter que es una letra? Parece que debería poder hacer algo como javax.swing.KeyStroke.getKeyStroke('c').getKeyCode(), pero eso no funciona (el resultado es cero). Todo el mundo sabe cómo obtener el código clave si ya tiene un KeyEvent, pero ¿y si solo quiere convertir los caracteres en VK? No estoy interesado en obtener el código FK para caracteres extraños, solo [A-Z], [a-z], [0-9].Obtenga el VK int de un carácter arbitrario en java

contexto de este problema -------- todos los tutoriales que he visto Robot asumen los programadores les encanta escribir palabras mediante el envío de pulsaciones de teclas con códigos VK:

int keyInput[] = { 
     KeyEvent.VK_D, 
     KeyEvent.VK_O, 
     KeyEvent.VK_N, 
     KeyEvent.VK_E 
    };//end keyInput array 

Llámame flojo, pero incluso con Eclipse, esta no es forma de utilizar TDD en las GUI. Si alguien sabe de una clase similar a Robot que toma cadenas y luego simula la entrada del usuario para esas cadenas (estoy usando FEST), me encantaría saber.

Respuesta

5

Tal vez esto feo Hack:

Map<String, Integer> keyTextToCode = new HashMap<String, Integer>(256); 
Field[] fields = KeyEvent.class.getDeclaredFields(); 
for (Field field : fields) { 
    String name = field.getName(); 
    if (name.startsWith("VK_")) { 
     keyTextToCode.put(name.substring("VK_".length()).toUpperCase(), 
          field.getInt(null)); 
    } 
} 

keyTextToCode contendría entonces el mapeo de cadenas (por ejemplo, "A" o "PAGE_UP") a vk códigos.

+0

+1 muy bueno, solo tenga en cuenta que falta el manejo de excepciones – dfa

1

No creo que haya una respuesta fácil para esto.

Primero tenga en cuenta que java tiene dos caracteres de byte y no se han definido casi 2^16 KeyEvent.VK_. Entonces habrá caracteres para los cuales no se puede generar KeyEvent para obtener esa salida.

Además, C y c, y Ç y ç tienen el mismo KeyEvent.getKeyCode() == KeyEvent.VK_C.

4
AWTKeyStroke.getAWTKeyStroke("C").getKeyCode(); 
6
AWTKeyStroke.getAWTKeyStroke('c').getKeyCode(); 

aclaración leve de Pace's answer. Debe ser comillas simples (que representan un caracter), no comillas dobles (que representan una cadena).

El uso de comillas dobles arrojará una java.lang.IllegalArgumentException (Cadena formateada incorrectamente).

1

La respuesta de Adam Paynter (respondida a la pregunta Convert String to KeyEvents) también debería funcionar aquí. La idea simple pero trabajar es tener un gran cambio como la siguiente:

public void type(char character) { 
    switch (character) { 
    case 'a': doType(VK_A); break; 
    case 'b': doType(VK_B); break; 
    case 'c': doType(VK_C); break; 
    case 'd': doType(VK_D); break; 
    case 'e': doType(VK_E); break; 
    // ... 
    case 'A': doType(VK_SHIFT, VK_A); break; 
    case 'B': doType(VK_SHIFT, VK_B); break; 
    case 'C': doType(VK_SHIFT, VK_C); break; 
    // ... 
    } 
} 

ver la respuesta original para el anuncio entero (incluyendo clase de utilidad circundante).

2

estoy usando el siguiente código de letras mayúsculas y números en una clase que escribió para extender robot:


public void typeLetterOrNumber(char c) { 
    if(Character.isLetter(c)) { 
     keyPress((int)c); 
     keyRelease((int)c); 
    } 
    else if(Character.isDigit(c)) { 
     keyPress(48+(int)c); 
     keyRelease(48+(int)c); 
    } 
} 

Básicamente, se limitó a los KeyEvent.VK_whatever valores e hicieron la matemática apropiada para compensar en mi código.

+0

Muy inteligente, gracias por la sugerencia !! –

0

Hay 2 maneras que encontré:

A. usar una solución de JButton.setMnemonic, getMnemonic:

javax.swing.JButton but = new javax.swing.JButton(); 
but.setMnemonic(charVkValue); 
int intVkValue = but.getMnemonic()); 

B. Descargar JDK fuente abierta y ver su método AbstractButton.setMnemonic (char). Este código tiene licencia bajo GPL2, pero estas 4 líneas generalmente son iguales a la respuesta con "keyPress (48+ (int) c)".

http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/swing/javax/swing/AbstractButton.java.htm

1

Si su objetivo principal es escribir las letras tan rápido como sea posible, se puede hacer lo que hice, que era escribir una cadena en el portapapeles, a continuación, sólo tiene que utilizar la clase Robot para entrar Ctrl + V.

static void type(String s) { 
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(s), null); 
    robot.setAutoDelay(30); 
    robot.keyPress(VK_CONTROL); 
    robot.keyPress(VK_V); 
    robot.keyRelease(VK_CONTROL); 
    robot.keyRelease(VK_V); 
} 

Hay algunas otras características en el portapapeles del sistema que podría permitir que permite guardar y restaurar los datos en el portapapeles, en caso de que necesitaba a. Además, si desea controlar la velocidad entre cada carácter, puede colocar cada letra en el portapapeles de a una por vez, con un robot.delay(n); entre ellas, utilizando un bucle foreach.

Cuestiones relacionadas