Domanda

Come si ottiene il codice VK da un carattere che è una lettera? Sembra che si dovrebbe essere in grado di fare qualcosa di simile javax.swing.KeyStroke.getKeyStroke('c').getKeyCode(), ma che non funziona (il risultato è zero). Tutti sanno come ottenere il codice della chiave, se si dispone già di un KeyEvent, ma cosa succede se si desidera solo per trasformare i caratteri in int VK? Io non sono interessato a ottenere il codice di FK per i caratteri strani, solo [A-Z], [a-z], [0-9].

Il contesto di questo problema -------- Tutti i tutorial robot che ho visto assumere programmatori amano precisare le parole con l'invio di pressione dei tasti con i codici VK:

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

Chiamami pigro, ma anche con Eclipse questo non è un modo per andare su come utilizzare TDD su GUI. Se qualcuno capita di sapere di una classe robot-like che prende stringhe e quindi simula l'input dell'utente per quelle stringhe (sto usando FEST ), mi piacerebbe sapere.

È stato utile?

Soluzione

Forse questo brutto 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 sarebbe poi contenere la mappatura da stringhe (ad esempio "A" o "PAGE_UP") per vk codici.

Altri suggerimenti

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

Lieve chiarimento della risposta di Pace. Dovrebbe essere virgolette singole (che rappresentano un carattere), virgolette non doppi (che rappresentano una stringa).

Uso le virgolette lancerà un java.lang.IllegalArgumentException (stringa formattata in modo non corretto).

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

Sto usando il seguente codice per lettere maiuscole e numeri in una classe che ho scritto per estendere 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);
    }
}

In fondo, ho solo guardato i KeyEvent.VK_whatever valori e fatto i calcoli appropriati per compensare nel mio codice.

Non credo che ci sia una risposta facile per questo.

Prima conto che Java ha due caratteri byte e non quasi 2 ^ 16 KeyEvent.VK_ di definito. Quindi ci stanno per essere caratteri per i quali non KeyEvent può essere generato per ottenere che in uscita.

Inoltre, C e C e C e C hanno tutti lo stesso KeyEvent.getKeyCode() == KeyEvent.VK_C.

La risposta di Adamo Paynter (risposto alla domanda Convertire String a KeyEvents ) dovrebbe anche lavoro qui. L'idea semplice ma di lavoro è quello di avere un grande interruttore come il seguente:

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

Si veda la risposta originale per l'intera lista (compresi circostante classe di utilità).

Se il vostro obiettivo primario è quello di scrivere le lettere più velocemente possibile, si può fare quello che ho fatto, che era quello di scrivere una stringa negli Appunti, poi basta usare il Robot classe di entrare 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);
}

Ci sono alcune altre funzioni del clipboard di sistema che potrebbe consentire di salvare e ripristinare tutti i dati negli appunti, in caso di bisogno. Come pure, se si voleva controllare la velocità tra ogni carattere, si potrebbe mettere ogni lettera nella clipboard uno alla volta, con un robot.delay(n); tra di loro, utilizzando un ciclo foreach.

Ci sono 2 modi che ho trovato:

A. Utilizzare una soluzione di JButton.setMnemonic, getMnemonic:

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

B. Scarica fonte JDK aperta e vedere il suo metodo AbstractButton.setMnemonic (char). Questo codice è sotto licenza GPL2, ma queste 4 righe fanno generalmente la stessa come la risposta con "keyPress (48+ (int) c)".

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top