java SWT中Label实时刷新当前时间

前段时间在做一个java的小项目的时候,做前端界面的时候,需要用到SWT,就是在一个Label上显示时间,而且是需要实时刷新的,就是时间一直在往前走,label上显示时间很简单。学过java的应该都清楚如何显示时间,SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sdf.format(new Date());

用上面两段代码就能把当前的时间格式化输出了,就是和我们日常看到的时间一样习惯,比如输出:2015-08-22 10:43:24.
而我需要做的是在SWT中的Label标签上显示当前实时的时间,就是需要不断的刷新,每隔一秒刷新时间,我开始考虑了用线程做,我先写的是在控制台上实时打印出时间,这个很简单,用线程,然后每次让它sleep(1000),每隔一秒就就打印出时间,但是当我想把时间输出到Label上时,发现一直报错,线程出错,我就纠结了很久,这样应该没有错啊。然后就去网上搜集各种资料,发现也有人遇到了这样的问题,看到论坛上有人写到,需要在标签之后加上.getDisplay().asyncExec(new Runnable(),因为这个就是处理界面的线程,网上的解释是它的主要作用:在非主线程中对SWT组件进行可能引起界面刷新的操作时使用
因为SWT的机制是不允许主线程以外的线程对SWT组件进行这种操作,所以如果你是在别的线程中执行该类代码,那必须用Lable.getDefault().asyncExec(new Runnable(){})(Lable换成shell都是没问题的,看你对什么刷新数据),最后加上这个之后,真的解决了问题,可以在Label上实时刷新时间了,代码附上:

package datetime;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;

import java.util.Date;

import org.eclipse.swt.SWT;
import org.eclipse.wb.swt.SWTResourceManager;

import com.ibm.icu.text.SimpleDateFormat;

public class TimeView {

    protected Shell shell;

    /**
     * Launch the application.
     * @param args
     */
    public static void main(String[] args) {
        try {
            TimeView window = new TimeView();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Open the window.
     */
    public void open() {
        Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    /**
     * Create contents of the window.
     */
    protected void createContents() {
        shell = new Shell();
        shell.setSize(450, 300);
        shell.setText("实时刷新时间");

        final Label label = new Label(shell, SWT.NONE);
        label.setFont(SWTResourceManager.getFont("微软雅黑", 13, SWT.NORMAL));
        label.setBounds(69, 48, 174, 41);
        new Thread() {//线程操作
               public void run() {
                   while(true){
                       try {
                           //对Label进行实时刷新,需要加上这句
                        label.getDisplay().asyncExec(new Runnable() {       
                            @Override
                            public void run() {
                                // 设置时间 ,格式化输出时间
                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                                String s = sdf.format(new Date());
                                label.setText(s);//输出到Label上            
                            }
                        });
                        Thread.sleep(1000);//每隔一秒刷新一次
                    } catch (Exception e) {
                    }

                   }
               }
        }.start();
    }
}

接下来就可以看到可以实时刷新时间了,如下图:
刚开启的时间
实时刷新后的时间

欢迎转载,转载请注明出处:【http://blog.csdn.net/szu_lzz/article/details/47857741

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值