문제

을 얻으려면 어떻게 해야 할 VK 코드를 문자는 편지?그것처럼 보인할 수 있어야 할 뭔가 javax.swing.KeyStroke.getKeyStroke('c').getKeyCode(), 지만,작동하지 않는(그 결과 zero).모두가 정보를 얻어내는 방법을 알고 있는 키 코드가 이미 있는 경우 KeyEvent,하지만 당신은 무엇을 설정 할 문자로 VK 수?에 관심이 점점 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

전화 나 게으른하지만,심지어 이클립스 이에 대한 이동하는 방법을 사용하여 TDD 에 Gui.면 누구나 일을 알고의 로봇과 같은 클래스에는 문자열한 다음 시뮬레이션 사용자 입력을 위해 그 문자열(사용 페스트),나는 사랑을 알고 있습니다.

도움이 되었습니까?

해결책

어쩌면이 추악한 해킹 :

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 코드로의 매핑을 포함합니다.

다른 팁

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

약간의 설명 페이스의 대답. 이중 인용문 (문자열을 나타내는)이 아닌 단일 따옴표 (문자를 나타냅니다) 여야합니다.

이중 인용문을 사용하면 java.lang.illegalargumentexception (문자열이 잘못 형식화 됨)이 발생합니다.

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

나는 로봇을 확장하기 위해 쓴 클래스에서 상위 문자와 숫자에 대해 다음 코드를 사용하고 있습니다.


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_whate 내 코드에서 보상하기 위해 적절한 수학을 가치 있고 수행했습니다.

지가 있다고 생각하지 않은 쉽게 대답합니다.

먼저 깨닫는 자바는 두 개의 바이트는 문자와 거의 2^16KeyEvent.VK_ 의 정의됩니다.그래서 거기에 있는 것 문자 없는 KeyEvent 생성할 수 있는 출력된다.

또한,C 및 c Ç 및 ç 모두 동일한 KeyEvent.getKeyCode() == KeyEvent.VK_C.

Adam Paynter의 답변 (질문에 대한 답변 문자열을 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;
    // ...
    }
}

전체 목록 (주변 유틸리티 클래스 포함)에 대한 원본 답변을 참조하십시오.

주요 목표가 가능한 한 빨리 문자를 쓰는 것이라면, 클립 보드에 문자열을 쓸 수있는 일을 할 수 있습니다. 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 루프를 사용합니다.

내가 찾은 두 가지 방법이 있습니다.

A. jbutton.setmnemonic, getMnemonic :의 해결 방법을 사용하십시오.

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

B. 열린 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top