2011-08-27 64 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会正确地计算出壳的边界。

相关问题