【问题标题】:java event queue event dispatch flush/trap eventsjava事件队列事件调度刷新/陷阱事件
【发布时间】:2011-05-20 14:35:51
【问题描述】:

我有一个与设计相关的问题,我正在努力寻找答案。

这是场景。

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

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

这就是我为处理这种情况所做的工作。

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

  1. 将光标更改为忙碌光标。
  2. 将鼠标侦听器添加到组件顶层框架的玻璃窗格中。
  3. 使玻璃窗格可见,以便它可以接收鼠标事件。由于鼠标输入,玻璃板不会执行任何操作。

第二步:在后台线程中执行耗时操作。后台线程有一个 finally 块,当作业完成(完成或因错误而中止)时通知事件线程。

第 3 步:

  1. 将鼠标光标切换回正常状态。
  2. 从玻璃窗格中删除侦听器。
  3. 使玻璃窗格不可见,以便鼠标事件到达预期的接收者。

这是处理此类情况的正确方法吗?

你们有什么推荐的?

【问题讨论】:

    标签: java events swing dispatch


    【解决方案1】:

    SwingWorker 可以在这种情况下使用。在done() 中启动和重新启用后台任务时,可以禁用相关控件。在这个相关的example 中,run 按钮的条件是在“运行”和“取消”之间切换。

    附录:Java 1.5 的反向端口可用here

    【讨论】:

    • 感谢您的回复。我正在探索 SwingWorker。它在 JDK 1.5 中不可用,因此我将尝试使用替代的 SwingWorker 实现。
    • 我已经链接到上面的一个后端端口。
    • SwingWorker 将完成这项工作。但是,我必须修改现有代码才能使其正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多