在显示SWT对话框时禁用非SWT窗口

时间:2016-05-06 22:39:44

标签: java swt lwjgl

我将SWT与非SWT窗口混合(以前是AWT窗口但我现在使用的是原生GLFW窗口)。当我调用fileDialog.show()时,我希望文件对话框获取完整的应用程序上下文,它在现有的非SWT窗口之上绘制,并且无法单击非SWT窗口。即,与使用AWT和AWT FileDialog时的行为相同。

但是,当我显示SWT FileDialog时,它仍然允许我单击另一个窗口并将该窗口置于前面。

以下是我设置应用的方式。我使用LWJGL 3(通过LibGDX),后者又通过GLFW绑定创建一个本机窗口。这也是我使用SWT的原因之一...... GLFW不支持AWT或Swing。

public static void main (String[] arg) {
    //...
    new Lwjgl3Application(app, config); //starts an OpenGL loop in a native GLFW window
    prepareSWT();
}

    static void prepareSWT (){
        swtThread = new Thread(new Runnable (){
            @Override
            public void run() {
                swtDisplay = new Display();
                swtShell = new Shell(swtDisplay);

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

        swtThread.start();
    }


    public static void showSWTFileChooserDialog (final FileChooserResult fileChooserResult){
        swtDisplay.asyncExec(new Runnable() {
            @Override
            public void run() {
                final org.eclipse.swt.widgets.FileDialog fileChooser =
                        new org.eclipse.swt.widgets.FileDialog(swtShell, SWT.OPEN);

                fileChooser.open();
                String filename = fileChooser.getFileName();

                if (filename == null || filename.equals("")){
                    fileChooserResult.file = null;
                } else {
                    fileChooserResult.file = new File(fileChooser.getFilterPath(), filename);
                }
                fileChooserResult.ready = true;
            }
        });
    }

我对如何在非SWT窗口上强制使用FileDialog感到茫然。

1 个答案:

答案 0 :(得分:0)

在Shell上设置SWT.SYSTEM_MODAL样式将阻止对系统上所有应用程序窗口的输入。

http://help.eclipse.org/luna/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/SWT.html#SYSTEM_MODAL