을 얻을 VK int 에서는 임의의 문자는 java
-
21-08-2019 - |
문제
을 얻으려면 어떻게 해야 할 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)"의 답과 동일합니다.