如何在不激活它的情况下打开shell?

时间:2014-09-30 11:45:52

标签: java shell swt eclipse-rcp jface

我需要知道是否有任何方法可以打开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();
    }
}

提前谢谢!

1 个答案:

答案 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);