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 仅针对其非模态父窗口而不是所有祖父窗口成为模态?