【问题标题】:Process other GUI events while in a loop在循环中处理其他 GUI 事件
【发布时间】:2017-06-08 01:14:52
【问题描述】:

我正在编写一个 Java 7 Swing 应用程序,该应用程序调用一个非 GUI 类来循环执行某些操作。不幸的是,循环运行时我无法与 GUI 交互。是否可以在该循环中强制处理 GUI 事件?

我正在寻找可以告诉 JVM 在继续循环之前处理其他 GUI 事件(例如按钮单击)的东西。

Java 7 Swing 中是否有一些东西可以满足我的需求,或者我真的必须自己处理多线程(我还没有那么远……)?

【问题讨论】:

  • 是什么阻止您为循环运行线程?
  • 事实上我还没有学到很多关于线程的知识。
  • 那么现在是学习的时候了 ;-) 但是像 swingworker 这样的特殊答案已经给出了!

标签: java swing


【解决方案1】:

不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用 Thread.sleep(n) 实现 Swing Timer 用于重复任务或 SwingWorker 用于长时间运行的任务。详情请见Concurrency in Swing

【讨论】:

  • +1...@wullxz 另见this 示例,它演示了SwingWorker。和this 进一步进入安德鲁斯评论Thread.sleep(..)
  • SwingWorker 成功了。但很高兴知道还有类似计时器的东西。 :)
【解决方案2】:

使用SwingWorker。基本上,所有 UI 事件处理总是在单个特定线程上完成,称为事件调度线程,并且在该线程中执行任何其他操作都会阻止 UI 事件(鼠标单击、键盘输入等)被处理,从而使 UI “挂起” .

SwingWorker 类已添加到 JRE 中,专门用于“在后台”(而不是在 UI 线程中)执行耗时的任务,并允许您轻松地在其他地方完成繁重的工作,可选择定期更新 UI (想想进度条),并在完成后再次选择更新 UI。您只需覆盖特定的方法(doInBackground()done())即可做到这一点,而且您永远不需要直接处理线程。

SwingWorker Javadoc page 拥有开始使用它所需的一切,包括示例代码。

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    相关资源
    最近更新 更多