控件刷新的奥秘

在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 }

猜你喜欢

转载自www.cnblogs.com/sunBinary/p/9857350.html