zoukankan      html  css  js  c++  java
  • 控件刷新的奥秘

    在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 }
  • 相关阅读:
    企业门户学习地址
    AX2009销售开票业务分析二
    AX2009销售开票业务分析一
    AX2009创建采购订单
    vs2008在工具箱中无法显示dynamics ax tools 解决办法
    使用tcp方式连接libvirtd
    ubuntu切换lightdm到kdm
    [转]服务器开发架构模式
    python实现简单消息总线
    自立,霸者的生存之道
  • 原文地址:https://www.cnblogs.com/sunBinary/p/9857350.html
Copyright © 2011-2022 走看看