每秒从另一个线程更新swt ui



我正在为MAC OS开发一个SWT java项目,我需要在SWT UI上添加一个标签,在那里我必须显示当前时间,每秒更新一次。

final Label lblNewLabel_1 = new Label(composite, SWT.CENTER);
FormData fd_lblNewLabel_1 = new FormData();
fd_lblNewLabel_1.left = new FormAttachment(btnNewButton_call, 10);
fd_lblNewLabel_1.bottom = new FormAttachment(100, -10);
fd_lblNewLabel_1.right = new FormAttachment(btnTransfer, -10);
fd_lblNewLabel_1.height = 20;
lblNewLabel_1.setLayoutData(fd_lblNewLabel_1);
    getDisplay().syncExec(new Runnable() {
            @Override
            public void run() {
                while(true){
                    lblNewLabel_1.setText(Calendar.getInstance().getTime().toString());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                }   
            }
        });

但是它不工作,请帮我做。

最好使用org.eclipse.swt.widgets.Display.timerExec(int, Runnable)方法及时更新UI

你不是在从另一个线程更新UI -你是在从UI线程本身更新UI。

在UI线程上的sleep将阻止UI线程做诸如绘画之类的事情,因此看起来你的程序已经挂起了。

而不是调度UI线程运行一个Runnable,更新一个小部件和睡眠一秒钟,你想要一个线程每秒钟睡眠,然后调度一个Runnable更新小部件,然后快速退出

例如:

while(true)
{
    getDisplay().asyncExec(new Runnable() {
        lblNewLabel_1.setText(Calendar.getInstance().getTime().toString());
    });
    Thread.sleep(1000);
}

我就是这样做的

Thread timeThread = new Thread() {
            public void run() {
                while (true) {
                    display.syncExec(new Runnable() {
                        @Override
                        public void run() {
                            lblNewLabel_1.setText(Calendar.getInstance().getTime().toString());
                        }
                    });
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        timeThread.setDaemon(true);
        timeThread.start();

最新更新