Question

Comment obtenir le code VK de char qui est une lettre? Il semble que vous devriez être en mesure de faire quelque chose comme javax.swing.KeyStroke.getKeyStroke('c').getKeyCode(), mais cela ne fonctionne pas (le résultat est égal à zéro). Tout le monde sait comment obtenir le code clé si vous avez déjà un KeyEvent, mais si vous voulez juste tourner en caractères ints VK? Je ne suis pas intéressé à obtenir le code FK pour les caractères étranges, seulement [A-Z], [a-z], [0-9].

Contexte de ce problème -------- Tous les tutoriels Robot J'ai vu les programmeurs suppose aiment épeler des mots en envoyant des codes VK pressions sur les touches:

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

Appelle-moi paresseux, mais même avec Eclipse ce n'est pas possible d'aller sur l'utilisation de TDD sur les interfaces graphiques. Si quelqu'un arrive à savoir d'une classe comme Robot qui prend des chaînes et simule ensuite l'entrée d'utilisateur pour les chaînes (j'utilise FEST ), j'aimerais savoir.

Était-ce utile?

La solution

Peut-être que ce hack laid:

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 contiendrait alors la correspondance entre les chaînes (par exemple "A" ou "PAGE_UP") à VK codes.

Autres conseils

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

réponse de Pace . Il devrait être des guillemets simples (représentant un caractère), pas des guillemets doubles (représentant une chaîne).

En utilisant des guillemets doubles va lancer une java.lang.IllegalArgumentException (String formaté de manière incorrecte).

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

J'utilise le code suivant pour les lettres majuscules et les chiffres dans une classe que j'ai écrit d'étendre 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);
    }
}

En fait, je viens de regarder les KeyEvent.VK_whatever des valeurs et fait le calcul approprié pour compenser dans mon code.

Je ne pense pas qu'il y ait une réponse facile à cela.

Tout d'abord se rendre compte que Java a deux caractères d'octets et non près de 2 ^ 16 KeyEvent.VK_ est défini. Donc, il va être pour les caractères qui ne KeyEvent peut être généré pour obtenir cette sortie.

En outre, C et c et cpour ont tous la même KeyEvent.getKeyCode() == KeyEvent.VK_C.

La réponse d'Adam Paynter (réponse à la question convertir la chaîne à KeyEvents ) devrait également travaille ici. L'idée simple mais travailler est d'avoir un grand interrupteur comme suit:

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;
    // ...
    }
}

Voir la réponse originale pour la liste entière (y compris classe utilitaire environs).

Si votre objectif principal est d'écrire les lettres aussi vite que possible, vous pouvez faire ce que je faisais ce qui était d'écrire une chaîne dans le presse-papiers, puis il suffit d'utiliser la classe pour entrer Robot 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);
}

Il y a quelques autres fonctionnalités dans le presse-papiers du système qui pourrait vous permettre de sauvegarder et de restaurer les données sur le presse-papiers, dans le cas où vous avez besoin de. De plus, si vous vouliez contrôler la vitesse entre chaque personnage, vous pouvez mettre chaque lettre le presse-papiers un à la fois, avec un entre eux robot.delay(n);, en utilisant une boucle foreach.

Il y a 2 façons je trouve:

A. Utilisez une solution de contournement de JButton.setMnemonic, getMnemonic:

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

B. Télécharger open source jdk et de voir sa méthode AbstractButton.setMnemonic (char). Ce code est distribué sous licence GPL2, mais ces 4 lignes font généralement la même que la réponse avec "keyPress (48+ (int) c)".

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top