这是我正在尝试做的事情:
我有一个 JFrame
,其中包含一个 JTextArea
,显示正在进行的连接的更新。如果用户想要取消连接,他们应该能够按其右侧的 JButton 。但是,由于连接在尝试连接时阻塞(使用)线程,因此 GUI 被卡住。我正在寻找快速修复方法。可能将 ActionListener 放在单独的线程上吗?尽管我可以基本使用可运行对象,但我对线程没有太多经验。
答案与使用 EDT 有关吗?如果是这样应该如何实现?
PS 澄清一下,该按钮应该能够终止创建连接的线程。看完之后好像是一个executorService。可以帮忙吗?是的?或者根本没有?
最佳答案
建议首先快速了解 Swing(或几乎任何 UI 框架)和多线程。这是餐巾纸版本:
- 对 UI 的任何修改或从中读取(例如,获取文本字段的值)必须仅在 UI 线程(有时也称为“Swing 线程”或“事件调度线程”(EDT)
- 任何阻塞或长时间运行的操作(例如网络通信)不得在 UI 线程上运行。否则它们将阻止按钮工作、文本更新等。
- 在 Java 中,
ExecutorService
及其 friend 将使长时间运行或阻塞的内容在后台线程上运行变得相对容易 - 如果后台线程发生需要更新 UI 的情况,请将 UI 相关代码封装在
EventQueue.invokeLater
调用中。这将确保您传递的Runnable
在 UI 线程上执行。
SwingWorker
类封装了此逻辑,并为更简单的情况提供了一个易于使用的帮助器。
第一次这样做时,可能有点令人畏惧,但彻底理解这一点是值得的,因为它不仅适用于 Swing,也适用于任何其他 UI 代码。
关于java - 防止 GUI 卡住并具有取消操作/终止线程的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16276902/