2011-07-08 6 views
0

私はロボットを使っていくつかの統合テストを書いています。私はロボットがメニューを開き、メニューからオプションの1つを選択する必要があります。 Enterキーは無視されているようです。メニューが開き、正しいメニュー項目が選択されていますが、Enterキーを押したときに実行されるようなアクションはとられていません。私が手動で適切なキーを押すと、予想通りのことが行われます。 Java以外のアプリケーションでロボットを実行すると、他のアプリケーションがenterイベントに正しく応答します。だから私は正しく入力イベントを送信していることを確認して、Javaメニューはそれに応答する必要があります。何かがうまくいかない。ロボットが生成するVK_EnterイベントをJavaが無視する

私はまた、入力イベントをスペースイベントで置き換えようとしました(メニューも応答する必要があります)、応答もありませんでした。

私は最新のsun JDKを使ってredhat Linuxで動作しています。私は、私はまったく同じ問題に遭遇した人を記述するこの記事を見つけたので、それは私のコードで明らかに問題ではないかなり確信しているが、それは何の解決策がありません:http://www.velocityreviews.com/forums/t666100-robot-and-awt-on-linux.html

private void requestTest(String testName){ 
    if(testName==currentTest) 
     return; 
    //overwrite config file with new data 
    currentTest=testName; 
    overwriteFile(configFile, getCurrentConfigFile()); 

    //close current graph 
    pressKeyCombo(KeyEvent.VK_CONTROL, KeyEvent.VK_F4); 

    //open File menu 
    pressKeyCombo(KeyEvent.VK_ALT, KeyEvent.VK_F); 
    //select the 'load defaults' option 
    pressKey(KeyEvent.VK_DOWN); 
    pressKey(KeyEvent.VK_DOWN); 
    pressKey(KeyEvent.VK_DOWN); 
    pressKey(KeyEvent.VK_SPACE); 
} 
+0

たぶん、そのプラットフォームの問題、多分そのコードの問題。問題を示すSSCCE(http://sscce.org)を投稿してください。 – camickr

+0

これはSSCCEではありません。それがどのようにコンパイルできるのかを私に説明してください。 – camickr

+0

これは私が持っているすべてのものですが、コードの小さな部分で問題を再現できませんでした。 – drew

答えて

0

私はついにこれを解決しました。ボタンのエフェクトとともに、イベントディスパッチスレッドで自分のロボットコードを実行させました。これは、ロボットが実行を完了するまで、どのボタンも私のロボットの動作に応答できないことを意味していました。

この場合、私のロボットが正しく動作しないのはどうしてもわかりません。私は、Ctrl-F4コマンドを削除すると、ロボットがenterコマンドに応答するが、ロボットが戻ったときに両方のコマンドがキューに入れられて正しく実行されているように見えることがわかった。私は、キューに入れられたイベントの数に制限があるとか、2つのイベントの間に何らかの形でデータアラウンドが発生したと考えています。いずれにしても、私のロボットを別のスレッドに動かすことで、私は望む動作を得ることができます。

SSCCEを作成できなかった理由は、ロボットをボタンに組み込もうとしたためで、ロボットに複数のイベントを同時に実行させようとしたためです。しかし、私は複数のイベントを行うロボットを産卵するボタンを試しませんでした。この問題を再現するために、私は元のコードと同じくらい複雑なコードで終わったでしょう。

0

私はあなたの問題であることを推測しますキーがUPのときにイベントがトリガーされている間だけVK_DOWNを使用していることを示します。つまり、キー入力イベントをシミュレートする必要があります(DOWN、UP)。それを試して、私はこれがうまくいくと思います。

+0

実際に私は私のコードの一部分だけを投稿することで問題になるのではないかと心配しています。押されたキーと押しているキーのコンボメソッドは、ボタンを押したり離したりするだけでなく、キーストロークの間に短いポーズを入れます – drew

1

まあ、私はEnterキーを押して同じ問題に立ち往生した。私も、Enterキーを押してネイティブOSファイル選択ダイアログを操作しようとしたときに何の説明もなく、うまくいきませんでした。しかし、問題は、Enterイベントを呼び出す別のRobotオブジェクトを作成することで解決できるようです。ですから少なくともあなたや他の孤独なサーファーたちが相談に来るのを助けてください。 ;-)

public static void enterKeyIssueTest() { 

    // both lines put some content to the Clipboard 
    StringSelection ss = new StringSelection("/fancyUser/tightDir/coolFile.apk"); 
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null); 

    // 1st Robot Object 
    Robot robot = new Robot(); 
    robot.keyPress(KeyEvent.VK_CONTROL); // press Ctrl 
    robot.keyPress(KeyEvent.VK_V);   // and press V 
    robot.keyRelease(KeyEvent.VK_V);  // release Ctrl 
    robot.keyRelease(KeyEvent.VK_CONTROL); // release V 

    // 2nd Robot to my avail 
    Robot okRobot = new Robot(); 

    // presses Enter 
    okRobot.keyPress(KeyEvent.VK_ENTER); // press Enter 
    okRobot.keyRelease(KeyEvent.VK_ENTER); // release Enter 
} 

実際これは非常に小さな例ですが、上記のコードの説明が役立つことを願っています。実際、2番目のRobotオブジェクトは私のためにEnterイベントを行いました。

敬具、 セモ

関連する問題