Подтвердить что ты не робот

Показать родительский модальный диалог с SWT

AWT/Swing позволяет отображать приложения модальные (блокирование всего приложения) и родительские модальные (блокирующие только родители) диалоги. Как я могу достичь этого с помощью SWT?

4b9b3361

Ответ 1

Чтобы заблокировать все приложение, вы можете создать диалог Shell со стилем SWT.APPLICATION_MODAL, откройте его и затем прокачайте события пользовательского интерфейса до тех пор, пока оболочка не будет расположена:

Display display = Display.getDefault();
Shell dialogShell = new Shell(display, SWT.APPLICATION_MODAL);
// populate dialogShell
dialogShell.open();
while (!dialogShell.isDisposed()) {
    if (!display.readAndDispatch()) {
        display.sleep();
    }
}

Если вы хотите заблокировать ввод только для родителя, попробуйте использовать стиль SWT.PRIMARY_MODAL, хотя Javadocs указывают (как и для других модальных стилей), что это подсказка; то есть, что различные реализации SWT могут точно не обрабатывать его одинаково. Аналогично, я не знаю о реализации, которая будет уважать стиль SWT.SYSTEM_MODAL.


ОБНОВЛЕНИЕ: ответьте на первый комментарий

Если вы одновременно открываете два или более основных модальных файла, вы не можете использовать трюки для накачки событий до тех пор, пока модальные функции не будут закрыты, поскольку они могут быть закрыты в любом порядке. Код будет запущен, но выполнение возобновится после цикла while после закрытия текущего диалога и всех других таких диалогов, которые были открыты после него. В этом случае я бы зарегистрировал DisposeListener в каждом диалоговом окне, чтобы получить обратный вызов, когда они закрыты. Что-то вроде этого:

void run() {
    Display display = new Display();
    Shell shell1 = openDocumentShell(display);
    Shell shell2 = openDocumentShell(display);

    // close both shells to exit
    while (!shell1.isDisposed() || !shell2.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    display.dispose();
}

Shell openDocumentShell(final Display display) {
    final Shell shell = new Shell(display, SWT.SHELL_TRIM);
    shell.setLayout(new FillLayout());
    Button button = new Button(shell, SWT.PUSH);
    button.setText("Open Modal Dialog");
    button.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            System.out.println("Button pressed, about to open modal dialog");
            final Shell dialogShell = new Shell(shell, SWT.PRIMARY_MODAL | SWT.SHEET);
            dialogShell.setLayout(new FillLayout());
            Button closeButton = new Button(dialogShell, SWT.PUSH);
            closeButton.setText("Close");
            closeButton.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    dialogShell.dispose();
                }
            });
            dialogShell.setDefaultButton(closeButton);
            dialogShell.addDisposeListener(new DisposeListener() {
                @Override
                public void widgetDisposed(DisposeEvent e) {
                    System.out.println("Modal dialog closed");
                }
            });
            dialogShell.pack();
            dialogShell.open();
        }
    });
    shell.pack();
    shell.open();
    return shell;
}