2013-02-22 37 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); 

那麼也許它不是最優雅的方式,但它到底工作。 任何更優雅的解決方案都是非常好的! :)