0

現在最大化されているシェルの「最大化されていない」ジオメトリを取得する必要があります。

私が行った場合

shell.setMaximized(false);
r = shell.getBounds();
...do something with r

「r」はシェルの最大化された境界のままです。これは、シェルへの「最大化解除」信号が後で処理されるためだと思います。問題は、システムに最初にシグナルを処理させて続行させるにはどうすればよいかということです。

境界を読み取る前に display.readAndDispatch() および/または shell.update() を配置しようとしましたが、機能しません。

前もってありがとう、ルカ。

4

2 に答える 2

0

あなたはこれを試すことができます:

shell.setMaximized(false);
Display.getCurrent().asyncExec(new Runnable() {
    @Override
    public void run() {
        Rectangle r = shell.getBounds();
        // ... do something with r
    }
});

また、試して使用することもできShell#computeSize(SWT.DEFAULT, SWT.DEFAULT)ます。それが役立つかどうかを確認してください。

于 2013-02-22T14:13:02.043 に答える
0

...わかりました、解決しました。

問題は、OS ウィンドウ マネージャーがシェルを最大化するために何らかのアニメーションや何かを実行する可能性があることです。また、シェルが破棄されている間、私はそれをやっていました...

なので、この方法で解決しました。イベントハンドルを破棄する際に、サイズを読み取ったときにシェルが破棄されないように event.doit = false を設定しました。次に、Timer を使用して、最大化されていないサイズを読み取る前に OS ウィンドウ マネージャーに処理を実行させ、最後にシェルを手動で破棄します。

        shell.setMaximized(false);      
        final Timer t = new Timer();
        t.schedule(new TimerTask() {

            @Override
            public void run() {
                display.asyncExec(new Runnable() {

                    @Override
                    public void run() {
                        t.cancel();
                        Rectangle r = shell.getBounds();
                                                // ... do something with r
                        shell.dispose();
                    }
                });
            }
        }, 1000);

おそらくそれは最もエレガントな方法ではありませんが、最終的には機能します。よりエレガントなソリューションは大歓迎です! :)

于 2013-02-22T15:20:36.670 に答える