2013-02-22 49 views
0

我需要获取当前最大化的壳体的“unmaximized”几何体。获取壳体的“未最大化”边界SWT

如果我做

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

“R” 将仍然是壳的最大化边界。我猜这是由于这个事实,即对shell的“unmaximize”信号稍后会被处理。所以问题是:我如何强制系统首先处理信号并继续?

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

在此先感谢,卢卡。

+0

我想你正在试图做到这一点,以记住你的应用程序下一次启动的shell的大小。在这种情况下,您可以只听“外壳”的SWT.Resize事件,从而跟踪外壳的大小。 – Baz 2013-02-22 15:59:53

回答

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),看看是否有帮助。

+0

最大的问题是,我需要这样做,而壳正在处理...所以当display.asynchExec运行时,shell是aready处置... whith这我需要改变模型。我宁愿(如果存在)同步的方式来做到这一点。 – lviggiani 2013-02-22 14:18:38

+0

我已经尝试手动处理异步外壳中的外壳,以避免外壳处置错误。不幸的是,即使在异步Exec中,也给了我最大化的shell大小。也许操作系统的窗口管理器仍然在做一些事情,而且还很早。线程休眠方法不起作用。将shell设置为可见false,然后再次为true,这会给我适当的大小但不正确的位置。 – lviggiani 2013-02-22 14:46:33

+0

如果正在处理外壳,则可能是最大化状态从未生效。也许你需要在shell的dispose被调用之前做到这一点。 – 2013-02-22 14:56:30

0

...好吧我解决了它。

问题是,操作系统窗口管理器可能会执行一些动画,或者为了最大限度地使用shell,所以我提前阅读了新的shell几何体。 另外我doig它,而外壳正在处理...

所以我解决了这种方式。 在处理事件句柄时,我设置了event.doit = false,以防止在读取大小时处理我的外壳。 然后我用定时器阅读unmaximized大小之前给操作系统窗口管理器做它的东西,最后我手动配置的外壳:

 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); 

那么也许它不是最优雅的方式,但它到底工作。 任何更优雅的解决方案都是非常好的! :)