AWT/Swing позволяет отображать приложения модальные (блокирование всего приложения) и родительские модальные (блокирующие только родители) диалоги. Как я могу достичь этого с помощью SWT?
Показать родительский модальный диалог с SWT
Ответ 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;
}