【问题标题】:SWT update UI when closing application关闭应用程序时 SWT 更新 UI
【发布时间】:2020-09-28 02:05:43
【问题描述】:

我有一个关闭操作的事件侦听器,在侦听器内部我需要在 UI 文本字段中显示一些消息。但是,即使使用了syncExec,UI似乎也没有更新,Runnable不会更新UI。

    shell.addListener(SWT.Close, new Listener() {
        public void handleEvent(Event event) {

            display.asyncExec(new Runnable() {
            public void run() {
                if(!text.isDisposed()) {
                     text.setText("app closing");    
                  }
            });
    });  

   while(!shell.isDisposed()) {
        if(!display.readAndDispatch()) {
            display.sleep();
        }           
   }

有什么想法吗?我是 SWT 的新手。 谢谢

【问题讨论】:

    标签: java user-interface swt


    【解决方案1】:

    SWT.Close 事件在 shell 实际释放之前发送。当代码返回到主 while(!shell.isDisposed()) 循环时,shell 将被标记为已释放,因此循环将终止并且 UI 不会再次更新(实际上更新 UI 的是 display.readAndDispatch() 调用)。

    你可以通过在 close listener 中调用 readAndDispatch 来让它工作,虽然我真的不喜欢这样:

    shell.addListener(SWT.Close, event -> {
       text.setText("app closing");
    
       Display display = shell.getDisplay();
    
       // Get events from setText dispatched
       while (display.readAndDispatch())
         { /* Do nothing */ }
    
       display.update();
    
       // TODO may need to sleep here
    });
    

    在这里进行测试,shell 在此事件之后关闭得如此之快,以至于没有时间查看更新 - 我不得不在侦听器的末尾添加一个 sleep(这更难看)。

    【讨论】:

      猜你喜欢
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多