java事件队列事件调度刷新/陷阱事件

时间:2011-05-20 14:35:52

标签: java events swing dispatch

我有一个与设计相关的问题,我正试图找到答案。

以下是该方案。

假设您希望由于用户输入而做一些昂贵的(耗时的)(例如,从某个数据库加载大量数据,读取大文件)。强烈推荐的方法是在单独的线程中完成耗时的工作,永远不会阻止EDT,否则GUI将无法响应。

但是有些情况下,除非后台任务完成,否则不应向GUI提供输入。在我的特定情况下,只有在后台工作完成后,我才能确定哪些GUI元素应该可见并启用/禁用。只有那些应该可见和启用的GUI元素才能响应用户输入,否则在我的特定情况下行为可能是不可预测的。

这就是我正在做的处理这种情况。

步骤1:在我即将开始一项耗时的操作之前。

  1. 将光标更改为忙碌光标。
  2. 将鼠标侦听器添加到组件顶层框架的玻璃板上。
  3. 使玻璃板可见,以便它可以接收鼠标事件。由于鼠标输入,玻璃板不起任何作用。
  4. 步骤2:在后台线程中执行耗时的操作。后台线程有一个finally块,在作业完成时通知事件线程(由于错误而完成或中止)。

    第3步:

    1. 将鼠标光标切换回正常状态。
    2. 从玻璃窗格中删除侦听器。
    3. 使玻璃板不可见,以便将鼠标事件发送给目标收件人。
    4. 这是处理此类情况的正确方法吗?

      你们推荐什么?

1 个答案:

答案 0 :(得分:5)

SwingWorker可以在此上下文中使用。在后台任务启动并在done()中重新启用时,可以禁用相关控件。在此相关的example中,run按钮可以在“运行”和“取消”之间切换。

附录:提供了Java 1.5的后端端口here