2009-12-19 10 views
1

J'ai attaché un écouteur à Shell sur les événements SWT.MouseUp et SWT.MouseDown, mais la méthode handleEvent n'est jamais déclenchée. J'ai essayé de cliquer à plusieurs endroits sur la fenêtre, mais il ne parvient même pas à System.out.println (..) dans le code ci-dessous ...L'ajout d'un écouteur à l'environnement Shell pour SWT.MouseUp ne fonctionne pas

Y at-il une erreur ici?

Merci!

//c is a Composite. 

final Listener l = new Listener(){ 
public void handleEvent(Event event) { 
System.out.println("Got event. "+event); 
Rectangle rect = c.getBounds(); 
if (rect.contains(event.x, event.y)){ 
    if((Boolean)c.getData("selected")){ 
     c.setData("selected", Boolean.FALSE); 
    }else{ 
     c.setData("selected", Boolean.TRUE); 
    } 
} 
} 
}; 
c.getShell().addListener(SWT.MouseUp, l); 
c.getShell().addListener(SWT.MouseDown, l); 

(Ce composite est à l'intérieur d'un éditeur Eclipse qui utilise la boîte à outils Forms)

Cordialement,

-Pradyumna

Répondre

2

En écrivant

c.getShell().addListener(SWT.MouseUp, l); 
c.getShell().addListener(SWT.MouseDown, l); 

vous ajoutez les auditeurs à la coque seulement! Cliquer sur un enfant du shell ne déclenche pas d'événement pour c.getShell(). Essayez de cliquer près de la bordure de la fenêtre et faites attention à votre message de trace.

Si vous souhaitez obtenir des événements pour les clics sur c, vous devez ajouter des écouteurs à c via c.addListener(.). Si vous faites cela, vous n'aurez pas besoin de la condition rect.contains(event.x, event.y) car vous savez que le clic s'est produit sur c.

+0

Merci. J'ai maintenant l'idée ... mais y a-t-il un moyen de connecter un écouteur à un composite qui se déclenche quand l'événement (tel que MouseDown) se produit sur n'importe quel descendant de ce composite? – Pradyumna

+1

Vous pouvez itérer à travers le 'getChildren()' d'un composite et ajouter les écouteurs à chacun. –

+1

Quelque chose de digne d'être mentionné pourrait être 'Display.addFilter (.)': Vous êtes informé de tout événement dans la boucle d'événements de l'affichage. Ce n'est pas exactement ce que vous demandez, et dans la plupart des cas, ce n'est pas la bonne façon de faire les choses, mais dans de rares occasions, c'est très utile. –