2009-03-20 40 views
8

Làm thế nào để bạn lấy mã VK từ một char là một chữ cái? Nó có vẻ như bạn sẽ có thể làm một cái gì đó như javax.swing.KeyStroke.getKeyStroke('c').getKeyCode(), nhưng điều đó không làm việc (kết quả là số không). Mọi người đều biết cách lấy mã khóa nếu bạn đã có KeyEvent, nhưng điều gì sẽ xảy ra nếu bạn chỉ muốn biến các ký tự thành mã VK? Tôi không muốn nhận mã FK cho các ký tự lạ, chỉ [A-Z], [a-z], [0-9].Lấy VK int từ một char tùy ý trong java

Bối cảnh của vấn đề này -------- Tất cả các hướng dẫn Robot Tôi đã nhìn thấy giả lập trình viên yêu thích rõ ràng lời bằng cách gửi keypresses với mã VK:

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

Gọi tôi là lười biếng, nhưng ngay cả với Eclipse, đây không phải là cách để sử dụng TDD trên GUI. Nếu bất cứ ai xảy ra để biết một lớp Robot giống như có chuỗi và sau đó mô phỏng đầu vào của người dùng cho những chuỗi (Tôi đang sử dụng FEST), tôi rất muốn biết.

Trả lời

5

lẽ hack xấu xí này:

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 sau đó sẽ chứa các ánh xạ từ chuỗi (ví dụ "A" hoặc "PAGE_UP") để VK mã.

+0

+1 rất tốt, chỉ cần lưu ý rằng xử lý ngoại lệ bị thiếu – dfa

1

Tôi không nghĩ rằng có một câu trả lời dễ dàng cho việc này.

Đầu tiên nhận ra rằng java có hai ký tự byte và không được xác định gần 2^16 KeyEvent.VK_. Vì vậy, sẽ có các ký tự mà không có KeyEvent nào có thể được tạo ra để có được kết quả đó.

Ngoài ra, C và c và Ç và ç đều có cùng số KeyEvent.getKeyCode() == KeyEvent.VK_C.

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

rõ Chếch Pace's answer. Nó phải là dấu nháy đơn (đại diện cho một ký tự), không phải dấu ngoặc kép (biểu diễn một chuỗi).

Sử dụng dấu ngoặc kép sẽ ném một java.lang.IllegalArgumentException (Chuỗi được định dạng không chính xác).

1

Câu trả lời của Adam Paynter (trả lời cho câu hỏi Convert String to KeyEvents) cũng nên hoạt động tại đây. Ý tưởng đơn giản nhưng hoạt động là có một công tắc lớn như sau:

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

Xem câu trả lời gốc cho toàn bộ danh sách (bao gồm cả lớp tiện ích xung quanh).

2

Tôi đang sử dụng đoạn mã sau cho chữ hoa chữ và số trong một lớp học tôi đã viết để mở rộng 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); 
    } 
} 

Về cơ bản, tôi chỉ nhìn vào KeyEvent.VK_whatever giá trị và đã làm toán thích hợp để bù vào mã của tôi.

+0

Rất thông minh, cảm ơn mẹo! –

0

Có 2 cách tôi tìm thấy:

A. Sử dụng cách giải quyết khác của JButton.setMnemonic, getMnemonic:

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

B. Tải xuống nguồn jdk mở và xem phương thức AbstractButton.setMnemonic (char) của nó. Mã này được cấp phép theo GPL2, nhưng 4 dòng này thường giống như câu trả lời với "keyPress (48+ (int) c)".

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

1

Nếu mục tiêu chính của bạn là để viết ra các chữ cái càng nhanh càng tốt, bạn có thể làm những gì tôi đã làm đó là viết một chuỗi vào clipboard, sau đó chỉ cần sử dụng lớp Robot nhập tổ hợp phím 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); 
} 

Có một số tính năng khác trong khay nhớ tạm thời hệ thống có thể cho phép bạn lưu và khôi phục mọi dữ liệu trên khay nhớ tạm, trong trường hợp bạn cần. Đồng thời, nếu bạn muốn kiểm soát tốc độ giữa mỗi ký tự, bạn có thể đặt từng chữ cái vào clipboard mỗi lần, với một số robot.delay(n); ở giữa chúng, sử dụng vòng lặp foreach.

Các vấn đề liên quan