Чтобы заблокировать все приложение, вы можете создать диалоговое окно 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;
}