Модальные диалоги остаются позади других окон в Opensuse.

В моем приложении есть диалоговые экраны, написанные java SWT. Когда открыто модальное диалоговое окно (диалог предупреждения/ошибки/файла и т. д.), оно не может оставаться поверх родительского экрана после нажатия на родительский экран или открывается за основным экраном. Диалог можно открыть, только нажав ALT+Tab. Эта проблема возникает на Opensuse 11.04. Это не происходит в Windows.

Классы Main и ShellExample предназначены для проверки проблемы. Когда вы нажимаете кнопку «открыть модальный диалог» в открывающейся оболочке, FileDialog отстает. MessageDialog открывается вверху, но при нажатии на оболочку он уходит назад.

Вот основной класс;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Display display = new Display();
        final Shell shell = new Shell(display);

        shell.setLocation(0,0);
        shell.setSize(500, 500);

        shell.setLayout(new GridLayout());
        FormToolkit  toolkit = new FormToolkit(shell.getDisplay());

        Button okButton = toolkit.createButton(shell, "  Open Shell  ", SWT.NONE);

        okButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                ShellExample mainDialog = new ShellExample(shell);
                mainDialog.open();
                }
          });

        shell.open();

        while (!shell.isDisposed()) {
          if (!display.readAndDispatch()) {
            display.sleep();
          }
        }
        display.dispose();

    }
}

и это класс ShellExample;

public class ShellExample extends Dialog {

    private Shell shell;
    public ShellExample(Shell parent) {
        super(parent, SWT.NO_TRIM | SWT.PRIMARY_MODAL);
        // TODO Auto-generated constructor stub
    }

    public Object open() {

        // TODO Auto-generated method stub
        shell = new Shell(getParent(), getStyle());
        createContents();

        shell.open();
        shell.layout();


        Display display = getParent().getDisplay();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }   
        return null;

    }

    private void createContents() {
        // TODO Auto-generated method stub

        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        shell.setSize(ge.getMaximumWindowBounds().width,ge.getMaximumWindowBounds().height);

        shell.setText(getText());
        shell.setLayout(new FillLayout());

        shell.setLayout(new GridLayout());
        FormToolkit  toolkit = new FormToolkit(shell.getDisplay());


        Button okButton = toolkit.createButton(shell, " open modal dialog ", SWT.NONE);

        okButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                FileDialog fd = new FileDialog(shell, SWT.SAVE);
                fd.setText("file dialog");
                fd.open();
             // MessageDialog.open(MessageDialog.WARNING  , shell, "warning_title", "warning_message", SWT.APPLICATION_MODAL);
            }
          });

    }
}

Какие-либо предложения?

Спасибо.


person user1766006    schedule 06.02.2013    source источник


Ответы (1)


В Linux такое поведение реализуется оконным менеджером (Gnome, KDE, XFCE, Enlightenment и т. д.). Я знаю, что некоторые оконные менеджеры Linux имеют особое просветление, а мозаичные оконные менеджеры не поддерживают модальные окна. Чтобы узнать, возможно ли то, что вы пытаетесь сделать, вы должны посмотреть документацию для оконного менеджера, который вы используете, чтобы узнать, поддерживает ли он это. Это можно найти, посмотрев на флаги NET_WM. Тот, который вы, вероятно, ищете, это _NET_WM_STATE_MODAL. Некоторую документацию по этому поводу можно найти на веб-сайте Free Desktop Standards, последняя спецификация на момент написания: http://standards.freedesktop.org/wm-spec/wm-spec-1.5.html

person simotek    schedule 20.05.2014
comment
Я использую оконный менеджер Gnome. Я понял, что если основной экран полноэкранный, то открытое окно появляется под основным экраном. Временное решение — не использовать полноэкранный режим. Я также не уверен, какова точная причина этой проблемы, и я не могу найти никакого другого решения. - person user1766006; 03.06.2014
comment
В настоящее время оконные менеджеры обычно отключают рендеринг, когда открыто полноэкранное окно, и перенаправляют буферы дисплея непосредственно в систему отображения, я знаю, что просветление отключает это, если поверх появляется отдельное всплывающее окно и имеет варианты отключения прямого прохождения полноэкранных окон, за 3 минуты гугления я не смог найти способ с помощью gnome. Вы можете получить дополнительную помощь, открыв сообщение об ошибке в системе отслеживания ошибок gnome о том, что диалоги, созданные в полноэкранных окнах, не отображаются. - person simotek; 04.06.2014