标签:显示 ane 刷新 没有 immediate 进度 date() over 相关
在swing中实现动态刷新组建内容是相当一件不给力的事情,例如JLable、LTextFiled等组件,其本身也提供了一些updateUI()、validate()以及paintImmediately()等等与界面刷新和组件重绘相关的方法,但通常都是不起作用的。
1 for (int i = 0; i < 5; i++) { 2 lblText.setText(String.format("当前进度:%s", i)); 3 lblText.updateUI(); 4 try { 5 Thread.sleep(1000); 6 } catch (Exception e1) { 7 e1.printStackTrace(); 8 } 9 }
希望每隔一秒种刷新一下Label内容,然而愿望是美好的,现实是残酷的,并没有出现我预想中的效果,仅仅显示了最终的结果,中间的过程忽略了。因为每次调用setText都是在主线程中执行的,而前几次调用之后线程并没有退出,所以界面也就没有刷新了^_^,只有最后一次执行完后线程才会退出,此时也就进行了刷新。找到了原因,解决也就相对变得容易了一些:
Java Swing中界面刷新是线程同步的
1.可以采用多线程运行
1 new Thread(new Runnable(){ 2 @Override 3 public void run() { 4 try { 5 for(int i = 0;i < 5; i++) { 6 lblText.setText(String.format("当前进度:%s", i)); 7 Thread.sleep(1000); 8 } 9 } catch (Exception e) { 10 e.printStackTrace(); 11 } 12 } 13 }).start();
2.结合JScrollPane实现及时动态刷新。在窗体区域创建一个JScrollPane组件,然后将JLabel组件放入JScrollPane中,执行以下代码,同样可以实现内容及时动态刷新。
1 try { 2 for(int i = 0; i < 5; i++) { 3 this.lblText.setText(String.format("当前进度:%s", i)); 4 this.lblText.updateUI(this.lblText.getBounds()); 5 Thread.sleep(1000); 6 } 7 } catch (Exception e) { 8 e.printStackTrace(); 9 }
标签:显示 ane 刷新 没有 immediate 进度 date() over 相关
原文地址:https://www.cnblogs.com/sunBinary/p/9857350.html