java 暂停gui_java-防止GUI冻结并具有取消操作/杀死线程的按钮

这是我正在尝试做的事情:

我有一个JFrame,其中包含一个JTextArea,用于显示正在进行的连接上的更新.如果用户想要取消连接,则应该能够按下其右侧的JButton.但是,由于尝试进行连接时连接正在阻塞(使用)线程,因此GUI被冻结.我正在寻找快速解决方案.将ActionListener放在单独的线程上可能吗?尽管我可以基本使用可运行对象,但我对线程没有太多经验.

答案是否与使用EDT有关?如果是这样,应如何实施?

PS为澄清起见,该按钮应该能够杀死创建连接的线程.看完后似乎是executorService.可以帮上忙吗?是?还是根本不?

解决方法:

建议首先了解有关Swing(或几乎任何UI框架)和多线程的知识.这是餐巾纸的版本:

>必须仅在UI线程(有时也称为“ Swing Thread”或“ Event Dispatch Thread”(EDT))上对UI进行任何修改或从中进行读取(例如,获取文本字段的值).

>任何阻塞或长时间运行的操作(例如网络通信)都不得在UI线程上运行.否则,它们将阻止按钮正常工作,文本无法更新等.

>在Java中,ExecutorService及其朋友将使在后台线程上运行长时间或阻塞的东西相对容易

>如果在后台线程上发生需要您更新UI的事件,请将与UI相关的代码封装在EventQueue.invokeLater调用中.这将确保您传递的Runnable在UI线程上执行.

SwingWorker类封装了此逻辑,并为更简单的情况提供了易于使用的帮助器.

第一次执行此操作时,可能会有些令人生畏,但彻底了解这一点很有意义,因为它不仅适用于Swing,而且适用于任何其他UI代码.

标签:java,multithreading,swing

来源: https://codeday.me/bug/20191009/1882781.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值