根据此处的另一个讨论,我尝试打开一个模态视图:
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
答案 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无效。