How can i open a shell without making it active?

天大地大妈咪最大 提交于 2019-12-10 11:16:32

问题


I need to know if there is any way to open a shell and not make it active, even if i click a control in it. The best way to explain what i need is to show you this little example. I need to keep the first shell active, even if i click the second one, or any widget that it contains.

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();
    }
}

Thank you in advance!


回答1:


You can change the style of your second Shell and use SWT.APPLICATION_MODAL which will make sure that you cannot interact with the parent shell unless you close the child shell:

final Shell shell2 = new Shell(shell, SWT.SHELL_TRIM | SWT.APPLICATION_MODAL);

The modality of an instance may be specified using style bits. The modality style bits are used to determine whether input is blocked for other shells on the display. The PRIMARY_MODAL style allows an instance to block input to its parent. The APPLICATION_MODAL style allows an instance to block input to every other shell in the display. The SYSTEM_MODAL style allows an instance to block input to all shells, including shells belonging to different applications.

Even SWT.PRIMARY_MODAL would suffice in this case.


UPDATE

If on the other hand you don't want the parent to loose focus when the child is clicked, just disable the child:

shell2.setEnabled(false);


来源:https://stackoverflow.com/questions/26120040/how-can-i-open-a-shell-without-making-it-active

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!