У меня есть SWT WizardDialog с несколькими страницами. Когда этот диалог открывается впервые, я должен проверить некоторые условия, и если эти условия соблюдены, мне нужно показать всплывающее окно поверх только что открытого диалога.
Итак, у меня есть этот код для прослушивания события 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();
За исключением того, что он называется слишком рано! Диалог не виден, когда вызывается обработчик. Мое окно сообщения появляется до того, как диалоговое окно становится видимым, и диалоговое окно появляется только тогда, когда я закрываю окно сообщения.
Очевидно, что SWT.Show ненадежен, по крайней мере, в Windows, где я его запускаю. Я также попытался поместить этот код в ShellListener при активации, но это происходит еще до примера SWT.Show выше.
Так как мне надежно отобразить окно сообщения, когда диалог становится видимым?
План B - это хак на основе грязного таймера, когда таймер настроен на запуск 200 мс в будущем и надеется, что он сработает, когда диалоговое окно станет видимым, но, очевидно, это может создать свои собственные проблемы.