Java 模式对话框位于Opensuse上其他窗口的背面

Java 模式对话框位于Opensuse上其他窗口的背面,java,swt,modal-dialog,opensuse,Java,Swt,Modal Dialog,Opensuse,在我的应用程序中,有由JavaSWT编写的对话框屏幕。当模式对话框(警告/错误/文件对话框等)打开时,在单击父屏幕后,它不能停留在父屏幕的顶部,或者在主屏幕的后面打开。只能通过按ALT+tab键打开该对话框。此问题发生在Opensuse 11.04上。它不会出现在Windows上 Main和ShellExample类用于测试问题。当您按下Openningshell中的“打开模式对话框”按钮时,FileDialog会出现。MessageDialog在顶部打开,但单击外壳时,它会返回 这里是主课堂

在我的应用程序中,有由JavaSWT编写的对话框屏幕。当模式对话框(警告/错误/文件对话框等)打开时,在单击父屏幕后,它不能停留在父屏幕的顶部,或者在主屏幕的后面打开。只能通过按ALT+tab键打开该对话框。此问题发生在Opensuse 11.04上。它不会出现在Windows上

Main和ShellExample类用于测试问题。当您按下Openningshell中的“打开模式对话框”按钮时,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);
            }
          });

    }
}
有什么建议吗


谢谢。

在Linux中,实现此行为取决于窗口管理器(Gnome、KDE、XFCE、启蒙等)。我知道一些Linux窗口管理器和平铺窗口管理器不支持模态窗口。要了解您正在尝试的操作是否可行,您应该查看您正在使用的窗口管理器的文档,看看它是否支持它。
这可以通过查看NET\u WM标志找到。您可能正在查找的是\u NET\u WM\u STATE\u model。关于这一点的一些文档可以在免费的桌面标准网站上找到,撰写本文时的最新规范是

我使用Gnome窗口管理器。我意识到,如果主屏幕是全屏的,那么打开的窗口就会出现在主屏幕下面。临时解决方案不是使用全屏。我也不确定这个问题的确切原因,也找不到任何其他解决方案。现在,当全屏窗口打开时,窗口管理器基本上会关闭渲染,并将显示缓冲区直接转发到显示系统,我知道如果一个单独的弹出窗口出现在顶部,并且有选项来禁用全屏窗口的直接通过,启蒙运动会禁用这个功能,在谷歌搜索的3分钟内,我看不到一个使用gnome的方法。通过在gnome bug跟踪器上打开一个bug,您可能会得到更多的帮助,这个bug是关于全屏窗口创建的对话框不会显示的事实。