如何检测 SWT 对话框已打开并且可见?

loc*_*cka 5 java eclipse rcp swt

我有一个WizardDialog包含许多页面的 SWT 。当这个对话框第一次打开时,我必须检查一些条件,如果满足这些条件,我需要在新打开的对话框上显示一个弹出窗口。

所以我有这个代码来监听SWT.Show事件。事件侦听器响应以SWT.Show进行其测试并显示一个消息框:

  final WizardDialog dialog = new WizardDialog(shell, wizard);
  dialog.setTitle("New Wizard");
  dialog.create();
  dialog.getShell().addListener(SWT.Show, new Listener()
  {
     private boolean firstShowing = true;

     @Override
     public void handleEvent(Event event)
     {
        if (firstShowing && someConditionExists())
        {
          MessageBox messageBox = new MessageBox(dialog.getShell(), SWT.OK
                 | SWT.ICON_WARNING);
          messageBox.setMessage("Test");
          messageBox.open();
          firstShowing = false;
        }
     }
  });
  dialog.open();
Run Code Online (Sandbox Code Playgroud)

除了它被称为太快了!调用处理程序时对话框不可见。我的消息框出现在对话框可见之前,并且对话框仅在我关闭消息框时出现。

很明显,这SWT.Show是不可靠的,至少在Window我运行它的地方是这样。我也尝试将此代码放入ShellListener激活中,但这甚至发生在SWT.Show上面的示例之前。

那么当对话框可见时如何可靠地显示消息框?

计划 B 是一个基于脏定时器的黑客,其中一个定时器被设置为在未来 200 毫秒内触发,并希望它在对话框可见时触发,但显然这可能会引入它自己的问题。

jef*_*unt 1

dialog.open()重写你的类上的方法怎么样WizardDialog?重写方法的第一行将调用super.open(),这将使其可见。只需将您的自定义代码放在该方法中即可.open()

您上面采用的方法的问题似乎是它响应 Show事件,这只是通知已请求 Show ,而不是对话框可见。Show 事件很可能被设计为让您知道什么时候将要显示某些内容,并在显示之前采取一些操作,正如您所经历的那样。

  • 我无法覆盖 Window.open() (这是打开对话框的方法),因为对话框被阻塞。open() 方法调用 shell.open(),然后调用 runEventLoop(),这是一个私有方法,用于泵送消息,直到对话框被处理为止。如果 runEventLoop() 受到保护,我可能可以在其中插入一些东西,但因为它不是,所以我不能。目前我正在使用计时器来弹出消息框,但显然这根本不符合我的喜好。 (3认同)