Я только что обнаружил гораздо лучшее решение. Это работает так.
Shell coverup = new Shell(SWT.NO_TRIM) ;
coverup.setBounds(parentComposite.getShell().getBounds());
coverup.moveAbove( Display.getCurrent().getActiveShell() );
coverup.setAlpha( 13 );
coverup.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
popupShell = new Shell( coverup, SWT.NO_TRIM );
coverup.addMouseMoveListener(new MouseMoveListener() {
@Override
public void mouseMove( MouseEvent mouseEvent )
{
System.out.println( "coverup - mouse moves" );
coverup.close() ;
}
});
Что по-английски:
Создайте невидимую оболочку того же размера, что и оболочка приложения / родителя.
Накройте родительскую оболочку невидимой оболочкой.
Прикрепите мышь. Введите слушателя к покрывающей оболочке.
Создайте фактическое всплывающее окно как дочерний элемент покрывающей оболочки и поверх нее
Когда мышь входит во всплывающее окно, активируйте прикрытие.
Это означает, что независимо от того, куда мышь попадает после появления всплывающего окна, она попадает в оболочку сокрытия - и событие ввода мыши сокрытия удаляет все.
Мы не определяем, когда мышь выходит из всплывающего окна, мы определяем, когда мышь входит в окружение.
Дополнительный бонус: установка фона прикрытия на светло-серый и низкий альфа-канал делает все приложение слегка «серым», поэтому пользователь знает, что он отключен.
Небольшая ошибка: если всплывающая оболочка не полностью содержится в окне приложения, где всплывающая оболочка выходит за пределы окна приложения, мышь может выйти без запуска оболочки прикрытия.
Кроме этого - это работает очень хорошо!