Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每秒从另一个线程更新swt ui_Java_Swt_Ui Thread - Fatal编程技术网

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

Java 每秒从另一个线程更新swt ui,java,swt,ui-thread,Java,Swt,Ui Thread,我正在为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_lblNe

我正在为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线程

sleep
UI线程上的挂起将阻止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();

看起来你使用了@EdwardThomson的方法。你应该投赞成票,然后接受他的回答……我已经接受了他的回答,但不能投赞成票,因为至少需要15个声誉。现在你有15个声誉;)@Mukesh Kumar:Sambi Reddy的答案更合适。我不这么认为,因为当我使用只运行一次而不是周期性的方法时。我调用了它,即
display.timerExec(1000,new Runnable(){@Override public void run(){lblNewLabel_1.setText(Calendar.getInstance().getTime().toString());})