5

私のツールでは、ユーザー アプリケーションから生成されたイベントを記録します。これで、ユーザーは自分のツールを使用してシナリオを再生できます。

ユーザーの記録されたシナリオを再生しながら、次を使用して、記録されたイベントを「EventQueue」に 1 つずつ投稿します。

eventQueueObj.postEvent(eventObj);

ほとんどの場合、ユーザーが記録したシナリオを再生しても問題ありません。

私の問題を説明するために、短い例を挙げます。

私のツールのユーザーは、自分のアプリケーションで「ファイル」メニューの「閉じる」ボタンが機能するかどうかを確認したいと考えています。彼のシナリオは次のとおりです。

1) ファイルメニューをクリックします。

2) [メニュー項目を開く] をクリックします。

3) ファイル チューザーからファイルを選択します。

4) ファイル チューザーで [開く] をクリックします。

5) ファイルが開いたら、[ファイル] メニューをクリックします。

6) [メニュー項目を閉じる] をクリックします。

手順 1 から手順 4 までは問題なく再生できます。手順 5 では、ファイルが開かれるまで待機することになっています (開くファイルは非常に大きく、時間がかかります)。ファイルが開かれるまで待たずに先に進むと、[ファイル] メニューの [閉じる] メニュー項目が無効のままになります。そのため、「閉じる」メニュー項目でマウス クリック イベントを発生させる必要はありません。

私の質問は、「イベント ディスパッチ スレッドから、現在のイベントの処理が完了したという情報を取得するにはどうすればよいですか?」です。

この後、「ファイル」メニューをクリックして、ステップ 6 に進みます。

「閉じる」メニュー項目が有効かどうかを再帰的に確認するためにsleep()を使用したくありません。おおよその時間ではなく、必要な時間だけ待ちたいからです。

sleep()を使用すると、ほとんどの場合、ユーザーのファイル オープン操作が終了しても、実行時間が無駄になります。

4

1 に答える 1

3

これはうまくいくはずです:

Toolkit.getDefaultToolkit().getSystemEventQueue().peekEvent() == null;

別の非同期アプローチは、特別な最後のイベントをプッシュし、そのリスナーを設定することです。そうすれば、イベント キューをポーリングしてビジー待機する必要がなくなります。

于 2013-01-18T11:44:54.307 に答える