获得shell SWT的“未最大化”界限

时间:2013-02-22 10:28:23

标签: java swt

我需要获得当前最大化的shell的“未最大化”几何体。

如果我这样做

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

“r”仍然是shell的最大边界。我想这是因为后来处理了对shell的“unmaximize”信号。所以问题是:如何强制系统首先处理信号并继续?

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

提前致谢Luca。

2 个答案:

答案 0 :(得分: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),看看是否有帮助。

答案 1 :(得分:0)

...好吧我解决了。

问题是OS窗口管理器可能会执行一些动画或其他东西以便最大化shell,所以我很早就开始阅读新的shell几何体。 在壳被处理的时候我也是这样做的。

所以我这样解决了。 在处理事件句柄时,我设置event.doit = false以防止在读取大小时放置我的shell。 然后我使用Timer让OS窗口管理器在读取未最大化的大小之前完成它的工作,最后我手动配置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);

好吧也许这不是最优雅的方式,但它最终会起作用。 任何更优雅的解决方案都很好! :)