我需要知道是否有任何方法可以打开shell而不是激活它,即使我单击其中的控件也是如此。解释我需要的最好的方法是向你展示这个小例子。我需要保持第一个shell处于活动状态,即使我单击第二个shell或它包含的任何窗口小部件。
public class TestMeOut
{
public static void main(final String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new GridLayout(1, false));
final Shell shell2 = new Shell(shell);
shell2.setLayout(new GridLayout());
final Button btn = new Button(shell, SWT.PUSH);
final Button btn2 = new Button(shell2, SWT.PUSH);
btn.setText("Test me");
btn2.setText("I steal focus");
btn.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(final SelectionEvent e)
{
shell2.setVisible(true);
}
});
btn2.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(final SelectionEvent e)
{
shell2.setVisible(false);
}
});
shell.pack();
shell.open();
shell.addShellListener(new ShellListener()
{
public void shellIconified(final ShellEvent e)
{
}
public void shellDeiconified(final ShellEvent e)
{
}
public void shellDeactivated(final ShellEvent e)
{
System.out.println("Deactivated! This isn't supposed to happen.");
}
public void shellClosed(final ShellEvent e)
{
}
public void shellActivated(final ShellEvent e)
{
System.out.println("Activated!");
}
});
shell2.pack();
shell2.open();
shell2.setVisible(false);
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
提前谢谢!
答案 0 :(得分:2)
您可以更改第二个Shell
的样式并使用SWT.APPLICATION_MODAL
,这样可以确保除非关闭子shell,否则无法与父shell进行交互:
final Shell shell2 = new Shell(shell, SWT.SHELL_TRIM | SWT.APPLICATION_MODAL);
可以使用样式位指定实例的模态。模态样式位用于确定输入是否被阻止显示器上的其他外壳。
PRIMARY_MODAL
样式允许实例阻止对其父级的输入。APPLICATION_MODAL
样式允许实例阻止输入到显示中的每个其他shell。SYSTEM_MODAL
样式允许实例阻止对所有shell的输入,包括属于不同应用程序的shell。
在这种情况下,即使SWT.PRIMARY_MODAL
也足够了。
<强>更新强>
另一方面,如果您不希望父母在点击孩子时失去焦点,请禁用孩子:
shell2.setEnabled(false);