8

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

この問題のコンテキスト--------私が見たすべてのロボットチュートリアルは、プログラマーがVKコードでキーを押すことによって単語を綴るのが好きだと想定しています。

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

私を怠惰と呼んでください。しかし、Eclipseを使用しても、これはGUIでTDDを使用する方法ではありません。文字列を受け取り、それらの文字列のユーザー入力をシミュレートするロボットのようなクラスを知っている人がいたら(私はFESTを使用しています)、知りたいです。

4

8 に答える 8

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

Pace's answer のわずかな説明。二重引用符 (文字列を表す) ではなく、一重引用符 (文字を表す) にする必要があります。

二重引用符を使用すると、java.lang.IllegalArgumentException (文字列の形式が正しくありません) がスローされます。

于 2010-11-05T20:40:41.247 に答える
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 には、文字列 ("A" や "PAGE_UP" など) から vk コードへのマッピングが含まれます。

于 2009-03-20T07:43:25.713 に答える
4
AWTKeyStroke.getAWTKeyStroke("C").getKeyCode();
于 2010-10-22T21:41:28.943 に答える
2

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

基本的に、KeyEvent.VK_whateverの値を見て、適切な計算を行ってコードを補正しました。

于 2011-06-29T16:44:35.730 に答える
1

あなたの主な目標ができるだけ早く文字を書き出すことである場合は、クリップボードに文字列を書き込むという私が行ったように、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 ループを使用して、間に を挟んで各文字を一度に 1 つずつクリップボードに入れることができます。

于 2015-01-25T06:29:06.567 に答える
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;
    // ...
    }
}

リスト全体(周囲のユーティリティクラスを含む)については、元の回答を参照してください。

于 2011-04-29T10:45:27.813 に答える
1

これには簡単な答えはないと思います。

最初に、Java には 2 バイト文字があり、2^16 近くの KeyEvent.VK_ が定義されていないことに注意してください。そのため、その出力を取得するために KeyEvent を生成できない文字が存在することになります。

また、C と c と Ç と ç はすべて同じKeyEvent.getKeyCode() == KeyEvent.VK_Cです。

于 2009-03-20T05:11:51.477 に答える
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(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

于 2011-10-09T14:58:34.110 に答える