使用 SWT 显示父模式对话框

2022-09-04 07:40:46

AWT/Swing 允许显示应用程序模式(阻止整个应用程序)和父模式(仅阻止父模式)对话框。如何通过 SWT 实现相同的目标?


答案 1

为了阻止整个应用程序,您可以使用样式创建对话框,打开它,然后抽取UI事件,直到shell被释放:ShellSWT.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();
    }
}

如果您只想阻止对父级的输入,请尝试使用样式 ,尽管Javadocs指定(与其他模态样式一样)这是一个提示;也就是说,不同的SWT实现可能不会以相同的方式处理它。同样,我不知道有哪一种实现会尊重这种风格。SWT.PRIMARY_MODALSWT.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;
}

答案 2

推荐