2009-03-20 15 views
8

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

contesto di questo problema -------- tutti i tutorial robot che ho visto assumono 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 non è possibile utilizzare TDD su GUI. Se qualcuno capisce di una classe simile a un robot che prende le stringhe e quindi simula l'input dell'utente per quelle stringhe (sto usando FEST), mi piacerebbe saperlo.

risposta

5

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

+0

+1 molto buono, basta notare che manca la gestione delle eccezioni – dfa

1

Non credo ci sia una risposta facile per questo.

Innanzitutto, rendersi conto che java ha due caratteri byte e non quasi 2^16 definiti da KeyEvent.VK_. Quindi ci saranno dei caratteri per i quali non è possibile generare KeyEvent per ottenere quell'output.

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

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

Lieve chiarimento di Pace's answer. Dovrebbe essere apici singoli (che rappresentano un carattere), non virgolette (che rappresentano una stringa).

L'uso di virgolette genererà una java.lang.IllegalArgumentException (stringa formattata in modo errato).

1

La risposta di Adam Paynter (risposta alla domanda Convert String to KeyEvents) dovrebbe funzionare anche 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; 
    // ... 
    } 
} 

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

2

Sto usando il seguente codice per lettere maiuscole e numeri in una classe ho scritto di 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 le KeyEvent.VK_whatever valori e fece la matematica appropriata per compensare il mio codice.

+0

Molto intelligente, grazie per il suggerimento !! –

0

Ci sono 2 modi che ho trovato:

A. utilizzare una soluzione alternativa di JButton.setMnemonic, getMnemonic:

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

B. Scarica fonte JDK aperto e vedere il suo metodo AbstractButton.setMnemonic (char). Questo codice è concesso in licenza sotto GPL2, ma queste 4 linee generalmente corrispondono alla risposta con "keyPress (48+ (int) c)".

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

1

Se il vostro obiettivo primario è quello di scrivere le lettere il più velocemente possibile, si può fare quello che ho fatto, che era quello di scrivere una stringa negli Appunti, poi basta usare la classe Robot per 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. Inoltre, se si desidera controllare la velocità tra ogni carattere, è possibile inserire ogni lettera negli appunti uno alla volta, con uno robot.delay(n); tra loro, utilizzando un ciclo foreach.