Frage

Wie beurteilen Sie den VK-Code aus einem char erhalten, die ein Brief? Es scheint so, sollten Sie in der Lage sein, so etwas wie javax.swing.KeyStroke.getKeyStroke('c').getKeyCode() zu tun, aber das funktioniert nicht (das Ergebnis ist null). Jeder weiß, wie den Schlüsselcode zu erhalten, wenn Sie bereits eine KeyEvent haben, aber was ist, wenn Sie wollen einfach nur Zeichen in VK ints verwandeln? Ich bin nicht daran interessiert, den FK-Code für seltsame Zeichen in immer, nur [A-Z], [a-z], [0-9].

Kontext dieses Problems -------- Alle der Roboter-Tutorials, die ich gesehen habe, übernehmen Programmierer lieben Worte durch das Senden von Tastenfolgen mit VK-Codes zu buchstabieren:

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

Rufen Sie mich faul, aber auch mit Eclipse dies ist keine Art und Weise über die Verwendung von TDD auf GUIs zu gehen. Wenn jemand geschieht einen Roboter-ähnliche Klasse zu wissen, die Strings nimmt und dann simuliert Benutzereingabe für die Strings (ich verwende FEST ), ich würde gerne wissen.

War es hilfreich?

Lösung

Vielleicht dieser hässliche 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 würde dann die Abbildung von Zeichenketten enthalten (beispielsweise "A" oder "PAGE_UP") Codes vk.

Andere Tipps

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

Leichte Klärung der Pace Antwort . Es sollte Sie (die eine Rolle), nicht doppelte Anführungszeichen (die einen String).

doppelte Anführungszeichen verwenden einen java.lang.IllegalArgumentException werfen (String formatiert falsch).

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

Ich verwende den folgenden Code für Großbuchstaben und Zahlen in einer Klasse I schrieb Roboter zu erweitern:


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);
    }
}

Im Grunde ich sah sie nur an den KeyEvent.VK_whatever Werte und hat die entsprechende Mathematik in meinem Code zu kompensieren.

Ich glaube nicht, gibt es eine einfache Antwort dafür.

Zuerst erkennen, dass Java-Zwei-Byte-Zeichen hat und nicht annähernd 2 ^ 16 KeyEvent.VK_ ist definiert. So gibt es werde Zeichen sein, für die keine KeyEvent erzeugt wird, dass die Ausgabe zu erhalten.

Auch, C und C und C und C haben alle die gleichen KeyEvent.getKeyCode() == KeyEvent.VK_C.

Die Antwort von Adam Paynter (auf die Frage beantwortet Convert String zu KeyEvents ) sollte ebenfalls arbeite hier. Die einfache, aber Arbeits Idee ist, einen großen Schalter wie folgt haben:

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

Die Original-Antwort für die ganze Liste (einschließlich umgebender Utility-Klasse).

Wenn Ihr primäres Ziel ist es, so schnell wie möglich, die Briefe zu schreiben, können Sie tun, was ich tat, die eine Zeichenfolge in die Zwischenablage zu schreiben waren, dann nur die Robot Klasse verwenden, um Strg + V ein.

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);
}

Es gibt einige andere Funktionen in die Zwischenablage, die Sie in die Zwischenablage alle Daten zu sichern und wiederherzustellen ermöglichen könnte, falls Sie nach Bedarf. Wie gut, Sie, wenn Sie die Geschwindigkeit zwischen dem einzelnen Zeichen steuern wollen, Sie jeden Buchstaben in der Zwischenablage einen nach dem anderen setzen können, mit einem robot.delay(n); zwischen ihnen, einer foreach-Schleife.

Es gibt 2 Möglichkeiten, die ich gefunden:

A. Verwenden Sie eine Abhilfe von JButton.setMnemonic, getMnemonic:

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

B. Laden offen jdk Quelle und sieht seinen AbstractButton.setMnemonic (char) -Methode. Dieser Code wird unter GPL2 lizenziert, aber diese 4 Zeilen tun im Allgemeinen das gleiche wie die Antwort mit "keyPress (48+ (int) c)".

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top