2009-03-20 5 views
8

문자 인 char로부터 어떻게 VK 코드를 취득합니까. javax.swing.KeyStroke.getKeyStroke('c').getKeyCode()과 같은 작업을 수행 할 수 있어야하지만 작동하지 않습니다 (결과가 0 임). 이미 KeyEvent를 가지고 있다면 키 코드를 얻는 방법을 모두 알고 있습니다 만, 문자를 VK int로 바꾸고 싶다면 어떻게해야할까요? 나는 이상한 문자들에 대한 FK 코드를 얻는 것에 관심이 없다. 오직 [A-Z], [a-z], [0-9]. 이 문제의Java의 임의의 char로부터 VK int를 취득한다

상황 -------- 내가 프로그래머 VK 코드와 함께 키 누름을 전송하여 단어를 철자 사랑 가정 본 적이 로봇 자습서의 모든 :

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

나를 게으르게 부르지 만, 이클립스조차도 GUI에서 TDD를 사용할 수 없다. 누구든지 문자열을 가져 와서 그 문자열 (나는 FEST을 사용하고 있습니다)에 대한 사용자 입력을 시뮬레이트하는 로봇과 같은 클래스에 대해 알고 있다면, 알고 싶습니다.

답변

5

어쩌면 이것은 추한 해킹 :

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 다음 코드를 VK 할 수있는 문자열에서 매핑 (예를 들어 "A"또는 "PAGE_UP")를 포함한다.

+0

+1 매우 좋음, 예외 처리가 누락되었음을 유의하십시오. – dfa

1

나는 쉬운 대답이 없다고 생각합니다.

처음에는 Java에 2 바이트 문자가 있고 거의 2^16 KeyEvent.VK_가 정의되지 않았다는 것을 알게되었습니다. 그래서 그 출력을 얻기 위해 KeyEvent를 생성 할 수없는 문자가있을 것입니다.

또한 C와 C 및 C와 C는 모두 KeyEvent.getKeyCode() == KeyEvent.VK_C입니다.

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

Pace's answer의 약간의 설명. 큰 따옴표 (문자열을 나타냄)가 아닌 작은 따옴표 (문자를 나타내는) 여야합니다.

큰 따옴표를 사용하면 java.lang.IllegalArgumentException (String formatted incorrectly)이 발생합니다.

1

Adam Paynter (질문 : Convert String to 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; 
    // ... 
    } 
} 

이 (주변의 유틸리티 클래스 포함) 전체 목록에 대한 원래의 답변을 참조하십시오 : 간단하지만 작업 아이디어는 다음과 같은 큰 스위치를하는 것입니다. 나는 수업 시간에 대문자 문자와 숫자에 대한 다음 코드를 사용하고

2

나는 로봇 확장 썼다 : 기본적으로


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 값을 보았고, 한 내 코드에서 보상 할 적절한 수학.

+0

팁이있어 매우 영리합니다! –

0

두 가지 방법이 있습니다.

A. JButton의 해결 방법을 사용하십시오.에는 setMnemonic, getMnemonic :

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

B. 오픈 JDK 소스를 다운로드하고 AbstractButton.setMnemonic (숯) 방법을 참조. 이 코드는 GPL2에 따라 사용이 허가되었지만,이 4 줄은 일반적으로 "keyPress (48+ (int) c)"와 같은 대답을합니다.

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

1

기본 목표는 가능한 한 빨리 편지를 작성하는 경우, 당신은 그럼 그냥 Ctrl 키를 입력 Robot 클래스를 사용하여 클립 보드에 문자열을 쓸이었다 내가 무슨 짓을 할 수 + 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); 
} 

는 당신이 필요로하는 경우에 당신이 클립 보드에 데이터를 저장 및 복원 할 수있는 시스템 클립 보드에 다른 기능이 있습니다. 또한 각 문자 사이의 속도를 제어하려는 경우 foreach 루프를 사용하여 각 문자를 한 번에 하나씩 클립 보드에 넣을 수 있습니다 (robot.delay(n);).