以编程方式检测窗口最大化/最小化??? Eclipse RCP

时间:2011-08-27 15:52:54

标签: swt eclipse-rcp

正如标题所示,我想为我的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
    }
    });
}

一切顺利,除非我最大化窗口然后最小化它,在这种情况下我松开了绘图(它在角落里)。 有什么好主意吗?我是以正确的方式思考的?

3 个答案:

答案 0 :(得分:1)

检测最小化和非最小化(不一定是最大化)的两个事件是IconifyDeiconify,它们只出现在Shell上。请参阅Shell的javadoc。

答案 1 :(得分:0)

考虑移动resize事件是为父母看到的,因为孩子不一定需要调整大小。

答案 2 :(得分:0)

为了将某些内容放在其他内容的中心,您需要的是SWT.Resize事件,因此这个问题是XY Problem的经典案例。 (除非在这种情况下OP似乎已经怀疑这可能是XY问题。)

然而,由于以下原因,许多人在合理地需要以编程方式检测窗口最小化/最大化/恢复事件时遇到此问题:

如果您希望能够在退出时保存应用程序窗口的边界,则不能只保存Shell.getBounds()返回的内容,因为您的应用程序可能会在最小化或最大化或全屏时终止,在这种情况下它的界限不应该坚持下去。应该坚持的是shell的最小化/正常/最大化/全屏状态(我称之为"姿势",)以及上次其姿势为#34;正常&#34时的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()

为了生成"最小化"事件,您可以使用shellIconified()的{​​{1}}方法作为@ the.duckman说,并再次调用ShellListener

为了生成"恢复(从最小化)"活动,您需要在recalculatePosture()

中执行以下操作
ShellListener

这将导致 之后短时间重新计算姿势