3

According to another discussion here, I try to open a modal view like so:

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();
}

It opens the desired window, but it's not modal. I can access the main shell and open another instance of the same modal dialog. Can anybody point me in the right direction?

Thanx, Marcus

4

2 回答 2

8

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

如果您使用主外壳作为参数调用构造函数,则可以在构造函数中调用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);
}

parentShellGUI 的主外壳在哪里。

于 2012-08-25T08:02:46.107 回答
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()一个全新的外壳,未连接到父窗口,因此 primary_modal 无效。

于 2016-07-07T13:58:44.330 回答