Вземете VK int от произволен char в java

Как да получите VK кода от char, който е буква? Изглежда, че трябва да можете да направите нещо като javax.swing.KeyStroke.getKeyStroke('c').getKeyCode(), но това не работи (резултатът е нула). Всеки знае как да получи кода на ключа, ако вече имате KeyEvent, но какво ще стане, ако просто искате да превърнете символите във VK int? Не се интересувам от получаване на FK кода за странни знаци, само [A-Z], [a-z], [0-9].

Контекст на този проблем -------- Всички уроци за роботи, които съм виждал, предполагат, че програмистите обичат да изписват думи, като изпращат натискания на клавиши с VK кодове:

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

Наречете ме мързелив, но дори и с Eclipse това не е начин да използвате TDD върху GUI. Ако някой случайно знае за роботоподобен клас, който приема низове и след това симулира потребителски вход за тези низове (използвам FEST), бих искал да знам.


person Myer    schedule 20.03.2009    source източник


Отговори (7)


Може би този грозен хак:

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 тогава ще съдържа съпоставянето от низове (напр. "A" или "PAGE_UP") към vk кодове.

person fulkod    schedule 20.03.2009

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

Леко пояснение на отговора на Пейс. Трябва да са единични кавички (представляващи знак), а не двойни кавички (представляващи низ).

Използването на двойни кавички ще хвърли java.lang.IllegalArgumentException (Низът е форматиран неправилно).

person pR0Ps    schedule 05.11.2010

Използвам следния код за главни букви и цифри в клас, който написах, за да разширя 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);
    }
}

По принцип просто погледнах стойностите на KeyEvent.VK_whatever и направих подходящата математика, за да компенсирам в моя код.

person bananaman42    schedule 29.06.2011

Не мисля, че има лесен отговор на това.

Първо осъзнайте, че java има два байта символа, а не почти 2^16 дефинирани KeyEvent.VK_. Така че ще има знаци, за които не може да се генерира KeyEvent, за да се получи този изход.

Също така C и c и Ç и ç имат едно и също KeyEvent.getKeyCode() == KeyEvent.VK_C.

person Clint    schedule 20.03.2009

Отговорът на Адам Пейнтър (отговорено на въпроса Конвертиране на низ в KeyEvents) също трябва да работи тук. Простата, но работеща идея е да имате голям превключвател като следния:

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

Вижте оригиналния отговор за целия списък (включително заобикалящия клас на полезност).

person Touko    schedule 29.04.2011

Ако основната ви цел е да изпишете буквите възможно най-бързо, можете да направите това, което направих аз, а именно да напишете низ в клипборда, след което просто използвайте класа 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);
}

Има някои други функции в системния клипборд, които могат да ви позволят да запазите и възстановите всички данни в клипборда, в случай че е необходимо. Също така, ако искате да контролирате скоростта между всеки знак, можете да поставите всяка буква в клипборда една по една, с robot.delay(n); между тях, като използвате foreach цикъл.

person Starwarswii    schedule 25.01.2015

Има 2 начина, които намерих:

A. Използвайте заобиколно решение на JButton.setMnemonic, getMnemonic:

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

Б. Изтеглете отворен код на jdk и вижте неговия метод AbstractButton.setMnemonic(char). Този код е лицензиран под GPL2, но тези 4 реда правят като цяло същото като отговора с "keyPress(48+(int)c)".

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

person Jarekczek    schedule 09.10.2011