建议首先了解有关Swing(或几乎任何UI框架)和多线程的知识。这是餐巾纸的版本:
- 在UI的任何修改或从中读取(例如,以获得一个文本框的值) 必须 做 只 在UI线程(有时也被称为“Swing线程”或“事件指派线程”上(EDT)
- 任何阻塞或长时间运行的操作(例如网络通信)都 不得 在UI线程上运行。否则,它们将阻止按钮正常工作,文本无法更新等。
- 在Java中,
ExecutorService
和其朋友将使在后台线程上运行长时间或阻塞的东西相对容易 - 如果在后台线程上发生需要您更新UI的事件,请在
EventQueue.invokeLater
调用中封装与UI相关的代码。这将确保Runnable
您传递的内容在UI线程上执行。
本
SwingWorker类封装这种逻辑,并提供一个易于使用的帮手简单的情况。
第一次执行此操作时,可能会有些令人生畏,但彻底了解这一点很有意义,因为它不仅适用于Swing,而且适用于任何其他UI代码。



