Java Swing的监听事件中使用 Thread.sleep()导致界面更新延时

Java Swing的监听事件中使用 Thread.sleep()导致整个界面更新延时显示

  • 写在前面

    ​ Java使用Swing后就会有三个线程

    1. 主线程,即程序启动时就产生的线程,执行main()方法
    2. toolkit 线程,负责捕捉系统事件,比如键盘、鼠标移动等。Toolkit线程的作用是把自己捕获的事件传递给第三个线程,也就是事件派发线程。
    3. 事件派发线程(EDT,Event Dispatcher Thread),顾名思义是用来派发事件(根据事件找到对应的事件处理代码)的线程。EDT接收来自 toolkit 线程的事件,并且将这些事件组织成一个队列,EDT的工作内容就是将这个队列中的事件按照顺序派发给相应的事件监听器,并且调用事件监听器中的回调函数,这也意味着,所有的事件处理代码都是在EDT而不是主线程中执行。

重点:上面说到EDT中维护了一个事件的队列,并且它们是按照顺序派发的。由于事件派发是单线程的操作,所以 只有等待前面事件监听器的回调函数执行完毕,才能够执行组件更新的操作,以及继续派发后面的事件。这样导致的一个后果就是:当在一个事件监听回调函数中做了耗时的操作,那么,界面会因此停住,并且界面上所有控件失效(不可触发)

  • 解决方法

    • 在事件派发线程中使用invokeLater()方法
Runnable doWorkRunnable = new Runnable() {
		public void run() {
          //这个里面写具体的处理方法,我这里是需要进行延时
            try {
                Thread.sleep(4000);
       		 } catch (InterruptedException e) {	
            e.printStackTrace();}
							}
		};
SwingUtilities.invokeLater(doWorkRunnable);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值