0

我需要获得当前最大化的壳的“未最大化”几何形状。

如果我做

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

"r" 仍然是 shell 的最大化边界。我猜这是由于稍后处理外壳的“unmaximize”信号。所以问题是:如何强制系统首先处理信号并继续?

我尝试在读取边界之前放置 display.readAndDispatch() 和/或 shell.update() 但它不起作用。

在此先感谢,卢卡。

4

2 回答 2

0

...好的,我解决了。

问题是操作系统窗口管理器可能会执行一些动画或一些东西来最大化外壳,所以我很早就开始阅读新的外壳几何。我也在处理外壳时正在做它......

所以我就这样解决了。在处置事件句柄时,我设置了 event.doit = false 以防止在我读取大小时处置我的外壳。然后我使用 Timer 让操作系统窗口管理器在读取未最大化的大小之前完成它的工作,最后我手动处理 shell:

        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 回答
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 回答