我的事件监听器处于关闭状态,在监听器内部,我需要在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的新手。谢谢
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
});
在此情况下测试外壳程序后,外壳关闭得如此之快,以至于没有时间查看更新-我不得不在侦听器的末尾添加一个睡眠(这更加难看)。