如何检查EDT(事件调度线程)是否已完成在Java中调度事件

Yog*_*hat 5 java events swing awt event-dispatch-thread

在我的工具中,我记录了从用户应用程序生成的事件.现在,用户可以使用我的工具重播他的场景.

在重放用户录制的场景时,我使用以下命令逐个将录制的事件发布到"EventQueue":

eventQueueObj.postEvent(eventObj);
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,重放用户的录制场景没有问题.

为了解释我的问题,我将举一个简短的例子.

我的工具的用户想检查在他的应用程序中,"文件"菜单下的"关闭"按钮是否有效.他的情景是:

1)单击"文件"菜单.

2)单击"打开菜单项"

3)从文件选择器中选择文件.

4)单击"文件选择器"上的"打开".

5)打开文件后,单击"文件"菜单.

6)单击"关闭菜单项".

重放步骤1到步骤4没有问题.现在在步骤5,我应该等到文件打开(文件被打开非常大并且需要一些时间).如果我不等到文件打开并向前移动,"文件"菜单下的"关闭"菜单项将保持禁用状态.因此,不会在"关闭"菜单项上触发鼠标单击事件.

我的问题是"如何从Event Dispatch Thread获取已完成当前事件处理的信息?"

在此之后,我可以点击"文件"菜单,然后点击步骤6.

我不想使用sleep()来递归检查是否启用了"关闭"菜单项.因为我只想等待所需的时间而不是一些大概的时间.

如果我使用sleep(),在大多数情况下,即使用户的文件打开操作完成,我也会浪费一些执行时间.

Mar*_*nik 3

这应该有效:

Toolkit.getDefaultToolkit().getSystemEventQueue().peekEvent() == null;
Run Code Online (Sandbox Code Playgroud)

另一种不同的异步方法是推送一个特殊的最后一个事件并为其设置一个侦听器。那么您就不需要通过轮询事件队列来忙等待。