2009-03-20 9 views
8

文字であるcharからVKコードを取得するにはどうすればよいですか? javax.swing.KeyStroke.getKeyStroke('c').getKeyCode()のようなことができるはずですが、うまくいかない(結果がゼロ)ようです。すでにKeyEventを持っている場合は誰もがキーコードを取得する方法を知っていますが、charをVK intに変換したいだけの場合はどうすればいいですか?私は、[A-Z]、[a-z]、[0-9]のみ、奇妙な文字のFKコードを取得することには興味がありません。この問題のJavaの任意のcharからVK intを取得

コンテキスト-------- 私はプログラマはVKのコードでキー入力を送信することによって、言葉を綴るのが大好きと仮定見てきたロボットのチュートリアルのすべて:

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

私はLazyと呼んでいますが、Eclipseでさえ、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(不正な形式の文字列)がスローされます。

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

2つの方法があります。

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); 
} 

あなたはあなたに必要な場合には、クリップボード上の任意のデータを保存し、復元できるようにすることができ、システムのクリップボード内の他のいくつかの機能があります。同様に、各文字間の速度を制御したい場合は、各文字を1つずつクリップボードに配置し、その間にrobot.delay(n);をforeachループを使用して配置できます。

関連する問題