SWT 模态对话框不是模态的

Posted

技术标签:

【中文标题】SWT 模态对话框不是模态的【英文标题】:SWT modal dialog not modal 【发布时间】:2012-08-25 07:15:11 【问题描述】:

根据这里的另一个讨论,我尝试像这样打开一个模式视图:

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 并打开同一模态对话框的另一个实例。谁能指出我正确的方向?

谢谢,马库斯

【问题讨论】:

【参考方案1】:

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

在构造函数中,您可以调用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。

【讨论】:

谢谢你,再次 8) 似乎没有多少程序员在处理 stw/jface (不再)。我是否错过了一个新的、华丽的桌面应用程序? @MarcusToepper Itoo 很惊讶,周围没有多少 SWT 开发人员。似乎他们都在处理 Swing/AWT。我都使用过,我真的更喜欢 SWT... 考虑到两者的时代,人们会想,无论如何可能会有任何新的 API,但如今,一切似乎都只围绕 Web 解决方案发展。比如用于应用程序的 JavaFX 或类似的东西。【参考方案2】:

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

我在新窗口的构造函数中使用了 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 没有任何作用。

【讨论】:

以上是关于SWT 模态对话框不是模态的的主要内容,如果未能解决你的问题,请参考以下文章

如何使 QDialog 仅针对其非模态父窗口而不是所有祖父窗口成为模态?

QT模态对话框及非模态对话框

QT笔记之模态对话框及非模态对话框

Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)

关于创建模态窗口和非模态窗口的研究

如何创建一个模态的对话框