Pregunta

¿Cómo se obtiene el código de VK de un char que es una carta? Parece que usted debería ser capaz de 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 de la llave si ya tiene una KeyEvent, pero lo que si lo que desea es convertir caracteres en enteros VK? No estoy interesado en conseguir el código de FK caracteres extraños, solamente [A-Z], [a-z], [0-9].

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

Me llaman perezoso, pero incluso con Eclipse esto no es una manera de ir sobre el uso de TDD en interfaces gráficas de usuario. Si alguien pasa a conocer de una clase como un robot que lleva cadenas y luego simula la entrada del usuario para esas cadenas (estoy usando FEST), me gustaría saber.

¿Fue útil?

Solución

Tal vez esto feo corte:

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.

Otros consejos

AWTKeyStroke.getAWTKeyStroke('c').getKeyCode();

de Pace respuesta . Debe ser comillas simples (que representan un carácter), de citas no dobles (que representan una cadena).

El uso de comillas dobles lanzará una java.lang.IllegalArgumentException (String formato incorrecto).

AWTKeyStroke.getAWTKeyStroke("C").getKeyCode();

Estoy utilizando el siguiente código de letras mayúsculas y números en una clase que escribí 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, Yo miraba a los KeyEvent.VK_whatever y los valores Hice los cálculos apropiados para compensar en mi código.

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

En primer lugar darse cuenta de que Java tiene dos caracteres de bytes y no casi 2 ^ 16 KeyEvent.VK_ de definirse. Por lo que no van a ser los caracteres para las que no se puede generar KeyEvent para conseguir que la producción.

También, C y C y C y C tienen el mismo KeyEvent.getKeyCode() == KeyEvent.VK_C.

La respuesta de Adam Paynter (contestado a la pregunta Convertir cadena a KeyEvents ) debería también Trabaja 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;
    // ...
    }
}

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

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 el Robot clase 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. Así, si querías para controlar la velocidad entre cada carácter, se puede poner cada letra en el portapapeles uno a la vez, con un robot.delay(n); entre ellos, utilizando un bucle foreach.

Hay 2 maneras que he encontrado:

A. Use 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 está disponible bajo GPL2, pero estas 4 líneas hacer generalmente la misma que 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top