SWT模态对话框不是模态的

时间:2012-08-25 07:15:12

标签: java dialog swt modal-dialog

根据此处的另一个讨论,我尝试打开一个模态视图:

public void widgetSelected(SelectionEvent e) {

    final Shell dialogShell = new Shell(ApplicationRunner.getApp()
            .getShell().getDisplay(), SWT.PRIMARY_MODAL | SWT.SHEET);

    dialogShell.setLayout(new FillLayout());

    Button closeButton = new Button(dialogShell, SWT.PUSH);
    closeButton.setText("Close");
    closeButton.addSelectionListener(new SelectionListener() {

        public void widgetSelected(SelectionEvent e) {
            dialogShell.dispose();
        }

        @Override
        public void widgetDefaultSelected(SelectionEvent arg0) {
            // TODO Auto-generated method stub

        }
    });
    dialogShell.setDefaultButton(closeButton);
    dialogShell.addDisposeListener(new DisposeListener() {

        public void widgetDisposed(DisposeEvent e) {
            System.out.println("Modal dialog closed");
        }
    });
    dialogShell.pack();
    dialogShell.open();
}

它会打开所需的窗口,但它不是模态的。我可以访问主shell并打开同一模态对话框的另一个实例。任何人都可以指出我正确的方向吗?

Thanx,Marcus

2 个答案:

答案 0 :(得分:7)

我强烈建议您通过扩展org.eclipse.jface.dialogs.Dialog来创建自己的JFace对话框,而不是使用按钮创建自己的shell。 Here是一个非常好的教程。

在构造函数中,如果使用主shell作为参数调用构造函数,则可以调用setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER | SWT.OK | SWT.APPLICATION_MODAL);,这将使此对话框完全模态化。像这样:

public CheckboxDialog(Shell parentShell) {
    super(parentShell);
    setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER | SWT.OK | SWT.APPLICATION_MODAL);
    setBlockOnOpen(true);
}

其中parentShell是GUI的主要外壳。

答案 1 :(得分:0)

今天我在创建一个单独的类中定义的弹出窗口时遇到了这个问题。

我在新窗口的构造函数中使用了类似popup_shell = new Shell(Display.getCurrent(), SWT.PRIMARY_MODAL | SWT.DIALOG_TRIM)的内容。

相反,如果我从父窗口传入shell,就像这样:

public PopupWindow(Shell main_shell)
{
    popup_shell = new Shell(main_shell, SWT.PRIMARY_MODAL | SWT.DIALOG_TRIM);
}

然后它正常工作。

我的猜测是,ApplicationRunner.getApp().getShell().getDisplay()Display.getCurrent()都会导致一个全新的shell,与父窗口无关,因此primary_modal无效。