Java SWT模态对话框非模态

Java SWT模态对话框非模态,java,dialog,swt,modal-dialog,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 FillL

根据这里的另一个讨论,我尝试打开一个模态视图,如下所示:

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

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

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

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

其中,
parentShell
是GUI的主shell。

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

我在新窗口的构造函数中使用了类似于
popup\u shell=new shell(Display.getCurrent(),SWT.PRIMARY\u MODAL | SWT.DIALOG\u 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,与父窗口没有连接,因此主模式没有任何效果。

thanx对您来说,同样是8)似乎没有太多程序员在处理stw/jface(现在)。“我是否错过了一个新的和华而不实的可能性来做桌面应用程序?”MarcusToepper Itoo惊讶地发现,SWT开发人员并不多。似乎他们都在处理Swing/AWT。我和这两个都有过合作,我真的更喜欢SWT……考虑到两者的年龄,有人会想,可能会有任何新的API,但现在,一切似乎都只围绕web解决方案发展。比如应用程序的JavaFX或者类似的东西。