2011-08-27 63 views
0

正如標題所示,我想添加一個偵聽器到我的rcp用戶界面以檢測最大化和最小化。其實,這不是我的真正目的,但我認爲這是解決我的問題的一種方法。我在中心有一些形狀的視圖,即使窗口調整大小,我仍然將繪圖保持在中心位置。要做到這一點,我用下面的聽衆:以編程方式檢測窗口最大化/最小化? Eclipse RCP

public void createPartControl(final Composite parent) { 
    display = parent.getDisplay(); 
    white= display.getSystemColor(SWT.COLOR_WHITE); 
    parent.setLayout(new FillLayout(SWT.VERTICAL)); 
    final ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); 
    sc.setExpandHorizontal(true); 
    sc.setExpandVertical(true); 
    sc.setMinHeight(100); 
    sc.setMinWidth(100); 
    sc.setSize(565, 305); 
    final Composite child = new Composite(sc,SWT.NONE); 
    child.setLayout(new FillLayout()); 
    // Set child as the scrolled content of the ScrolledComposite 
    sc.setContent(child); 
    child.setBackground(white); 
    gc = new GC(child); 
    parent.addListener (SWT.Resize, new Listener() { 
     public void handleEvent (Event e) { 
      x = child.getBounds().width/2; 
      y = child.getBounds().height/2; 
      child.addPaintListener(new PaintListener() { 
       public void paintControl(PaintEvent event) { 
        dessin(gc); // draw my shapes 
    } 
    }); 
} 

一切順利的話除非我最大化窗口,然後將其最小化,在這種情況下,我失去了繪畫(它是在角落)。 有什麼想法嗎?我是以正確的方式思考?

+0

這個例子中似乎缺少一些重要的代碼。但是......當父母看到resize事件時,孩子不一定需要調整大小。 –

+0

哦,是的,你是對的,我必須添加聽者的孩子,而不是父母..謝謝 – jean24

回答

1

檢測最小化和非最小化(不一定是最大化)的兩個事件是IconifyDeiconify,它們只發生在Shell上。查看javadocs的Shell

0

考慮移動resize事件對父母來說是可見的,因爲孩子不一定需要調整大小。

0

爲了讓東西保持在別的東西的中心,所有你需要的是SWT.Resize事件,所以這個問題是XY Problem的經典案例。 (除了在這種情況下的OP似乎已經懷疑這可能是一個XY問題)。

然而,許多人到達這個問題的合法需要,以編程方式檢測窗口最小化/最大化/恢復事件,爲原因如下:

如果您希望能夠在退出時保存應用程序窗口的邊界,則不能保存Shell.getBounds()返回的任何內容,因爲您的應用程序可能會在最小化,最大化或全屏時終止在這種情況下,它的界限不應該被持續。應該堅持的是shell的最小化/正常/最大化/全屏狀態(我稱之爲「姿態」),以及上一次shell的邊界處於「正常」狀態時的邊界。所以,基本上,你需要跟蹤姿勢何時「正常」,並且爲此你需要有一個「姿勢改變」事件。

問題是,當SWT發出「deiconified」事件時,它還沒有計算shell的邊界,所以你在這種情況下得到的值是假的。

所以,這裏是解決的是:

您將需要其重新計算姿勢如下的方法:

private void recalculatePosture() 
{ 
    Posture posture = swtShell.getFullScreen()? Posture.FULLSCREEN 
     : swtShell.getMinimized()? Posture.MINIMIZED 
     : swtShell.getMaximized()? Posture.MAXIMIZED 
     : Posture.NORMAL; 
    if(posture != previousPosture) 
    { 
     issue event... 
     previousPosture = posture; 
    } 
} 

爲了產生「最大化」,「恢復(從最大化)「和」全屏「事件,您可以使用Shell.addListener()來偵聽SWT.MoveSWT.Resize事件,並在發生事件時調用recalculatePosture()

爲了生成「最小化」事件,您可以使用ShellListenershellIconified()方法,如@ the.duckman所述,並且再次調用recalculatePosture()

爲了產生「恢復(從最小化)」事件,你需要做以下的ShellListener

@Override 
protected void onShellDeiconified(ShellEvent e) 
{ 
    display.asyncExec(() -> recalculatePosture()); 
} 

這將導致姿勢的重新計算很短的時間後這個'去除信號'的事件,在這一點上,SWT會正確地計算出殼的邊界。

相關問題