[关闭应用程序时SWT更新UI

问题描述 投票:0回答:1

我的事件监听器处于关闭状态,在监听器内部,我需要在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个回答
0
投票

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

您可以通过在关闭的监听器中调用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
});

在此情况下测试外壳程序后,外壳关闭得如此之快,以至于没有时间查看更新-我不得不在侦听器的末尾添加一个睡眠(这更加难看)。

© www.soinside.com 2019 - 2024. All rights reserved.