2

私のアプリケーションには、JavaSWTによって作成されたダイアログ画面があります。モーダルダイアログ(警告/エラー/ファイルダイアログなど)を開くと、親画面をクリックした後、親画面の上に留まらないか、メイン画面の後ろで開きます。ダイアログは、Alt+Tabキーを押すことによってのみ開くことができます。この問題はOpenSUSE11.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);
            }
          });

    }
}

助言がありますか?

ありがとう。

4

1 に答える 1

0

Linux では、この動作を実装するのはウィンドウ マネージャー (Gnome、KDE、XFCE、Enlightenment など) 次第です。いくつかの Linux ウィンドウ マネージャーの特殊性とタイリング ウィンドウ マネージャーがモーダル ウィンドウを尊重しないことを私は知っています。実行しようとしていることが可能かどうかを調べるには、使用しているウィンドウ マネージャーのドキュメントを参照して、それがサポートされているかどうかを確認する必要があります。これは、おそらく _NET_WM_STATE_MODAL を探している NET_WM フラグを見ることで見つけることができます。これに関するドキュメントは、Free Desktop Standards Web サイトで見つけることができます。執筆時点での最新の仕様はhttp://standards.freedesktop です。 org/wm-spec/wm-spec-1.5.html

于 2014-05-20T04:44:07.993 に答える