我有一个与设计相关的问题,我正在尝试寻找答案。
这是场景。
假设你想根据用户输入做一些昂贵(耗时)的事情(例如从某个数据库加载大量数据,读取大文件)。强烈推荐的方法是在单独的线程中完成耗时的工作,永远不要阻塞 EDT,否则 GUI 将变得无响应。
但是,在某些情况下,除非后台任务完成,否则您不应该向 GUI 提供输入。在我的具体情况下,只有在后台工作完成后,我才能确定哪些 GUI 元素应该可见和启用/禁用。只有那些应该可见和启用的 GUI 元素才应该响应用户输入,否则在我的特定情况下行为可能是不可预测的。
这就是我正在做的事情来处理这种情况。
第 1 步:在我开始一项耗时操作之前。
- 将光标更改为忙碌光标。
- 将鼠标监听器添加到组件顶级框架的玻璃面板。
- 使玻璃面板可见,以便它可以接收鼠标事件。玻璃板不会因鼠标输入而执行任何操作。
第二步:在后台线程中执行耗时操作。后台线程有一个 finally block ,当作业完成(完成或由于错误而中止)时通知事件线程。
第 3 步:
- 将鼠标光标切换回正常状态。
- 从玻璃面板中移除监听器。
- 使玻璃板不可见,以便鼠标事件到达预期的接收者。
这是处理此类情况的正确方法吗?
你们有什么推荐的?
最佳答案
SwingWorker
可以在这种情况下使用。后台任务启动时可以禁用相关控件,并在done()
中重新启用。在这个相关example ,run
按钮可以在“Run”和“Cancel”之间切换。
附录:Java 1.5 的反向端口可用 here .
关于java事件队列事件调度刷新/陷阱事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6073469/