2011-08-27 3 views
0

Comme le titre le montre, je veux ajouter un écouteur à mon interface utilisateur rcp afin de détecter la maximisation et la minimisation. En fait, ce n'est pas mon but réel, mais je pense que c'est un moyen de résoudre mon problème. J'ai une vue avec quelques formes au centre, et je vais garder le dessin exactement au centre même si la fenêtre est redimensionnée. Pour ce faire, je l'auditeur suivant:Détecter par programme la maximisation/minimisation de fenêtre ??? 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 
    } 
    }); 
} 

tout va bien sauf quand j'agrandissez la fenêtre, puis le réduire, dans ce cas, je lâche le dessin (il est dans le coin). Une idée s'il vous plaît? Je pense à la bonne façon?

+0

Il semble qu'il manque un code vital dans l'exemple. Mais ... lorsque l'événement resize est vu pour le parent, l'enfant n'a pas besoin d'être redimensionné. –

+0

Oh oui, vous avez raison, je dois ajouter l'auditeur à l'enfant et non le parent .. merci – jean24

Répondre

1

Les deux événements détectant la minimisation et la minimisation (pas nécessairement la maximisation) sont Iconify et Deiconify qui se produisent uniquement sur le shell. Voir les javadocs pour Shell.

0

Envisagez de déplacer l'événement de redimensionnement pour le parent, car l'enfant n'a pas besoin d'être redimensionné pour l'instant.

0

Afin de garder quelque chose au centre de quelque chose d'autre tout ce dont vous avez besoin est l'événement SWT.Resize, donc cette question est un cas classique du XY Problem. (Sauf que le PO dans ce cas semble déjà soupçonner que cela peut être un problème XY.)

Cependant, beaucoup de gens arrivent à cette question avec un besoin légitime de détecter par programme les événements window minimized/maximized/restore, pour le Si vous voulez enregistrer les limites de la fenêtre de votre application à la fermeture, vous ne pouvez pas enregistrer simplement ce qui est renvoyé par Shell.getBounds(), car votre application peut être interrompue en étant réduite ou agrandie ou en plein écran , auquel cas ses limites ne devraient pas être persistantes. Ce qui devrait être persistant est l'état minimisé/normal/maximisé/plein écran du shell, (je l'appelle "posture",) et les limites de la coque la dernière fois que sa posture était "normale". Donc, essentiellement, vous devez garder une trace de quand la posture est "normale", et pour cela vous devez avoir un événement "posture changée". Le problème est que lorsque SWT émet l'événement "déiconifié", il n'a pas encore calculé les limites du shell, donc la valeur que vous obtenez dans ce cas est fausse.

Donc, voici la solution que:

Vous allez avoir besoin d'une méthode qui recalcule la posture comme suit:

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

Afin de générer le « maximisé », « restauré (à partir des événements maximized) "et" fullscreen ", vous pouvez utiliser Shell.addListener() pour écouter l'événement SWT.Move et SWT.Resize et appeler recalculatePosture() lorsqu'ils se produisent.

Afin de générer le « minimisé » si vous pouvez utiliser comme @ the.duckman la méthode shellIconified() du ShellListener dit, et encore, appelez recalculatePosture().

Afin de générer le « retour (à partir réduits au minimum) » événement, vous devez faire ce qui suit dans votre ShellListener:

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

Cela entraînera le recalcul de la posture un peu de temps après l'événement 'déiconifié', à quel point SWT aura calculé correctement les limites de la coque.