【问题标题】:Updating swt ui from another thread every second每秒从另一个线程更新 swt ui
【发布时间】:2013-04-16 13:31:32
【问题描述】:

我正在为 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();
                }
                }   
            }
        });

但它不起作用,请帮我这样做。 提前致谢。

【问题讨论】:

    标签: java swt ui-thread


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您不是从另一个线程更新 UI - 您是从自身更新 UI 线程。

      在UI线程上sleeping会阻止UI线程做绘画之类的事情,所以看起来你的程序已经挂了。

      与其安排 UI 线程运行 Runnable 来更新小部件并休眠一秒钟,不如让线程每秒休眠一次,然后调度 Runnable 来更新小部件然后退出快

      例如:

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

      【讨论】:

        【解决方案3】:

        我确实做到了..使用以下代码

        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 reddys 的回答更合适。
        • 我不这么认为,因为当我使用只运行一次而不是定期运行的方法时。我称之为display.timerExec(1000, new Runnable() { @Override public void run() { lblNewLabel_1.setText(Calendar.getInstance().getTime().toString()); } });
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 2019-06-30
        • 2014-12-16
        • 1970-01-01
        相关资源
        最近更新 更多