2009-05-24 5 views
5

J'ai beaucoup lu sur les forums et les didacticiels, mais je n'arrive toujours pas à comprendre les événements et les écouteurs d'événements. J'ai un exemple assez simple, mais je n'arrive pas à le faire fonctionner.Ajout d'un écouteur d'événement personnalisé dans as3

J'ai une arrayCollection d'objets personnalisés dans un répéteur, lorsque l'un de ces objets est cliqué, je veux un composant différent pour afficher les données associées à cet objet.

Voici ce que j'ai, mais l'écouteur ne répond jamais (le répartiteur semble fonctionner, parce que le nouvel événement est créé et je peux voir la trace avec la bonne sortie.) Je suppose que c'est parce que quand j'appelle addEvent Écouteur, je le fais sur le mauvais objet. Ma compréhension est que l'objet qui affichera les données de l'objet est l'objet qui devrait avoir l'écouteur d'événement, et écouter tous les événements de cette nature, mais peut-être que j'ai mal compris.

Mon événement personnalisé:

public class SelectObjectEvent extends Event 
    { 
     public function SelectObjectEvent(customEventString:String, myObject:customObject) 
     { 
       super(customEventString, true, false); 
       trace(customEventString+" "+myObject); 
     } 
    } 
} 

Mon objet personnalisé a la fonction suivante qui est appelé clic:

public function selectObject(myObject:customObject):void 
     { 
      dispatchEvent(new SelectObjectEvent("OBJECT_SELECTED", customObject));    
     } 

Et la composante je veux afficher l'objet sélectionné a le constructeur suivant:

public function SelectedObjectDisplayClass() 
     { 
      addEventListener("OBJECT_SELECTED", this.showObject) 
     } 

     public function showObject(event:Event):void 
      { 
      trace("Show object: "+event); 
     } 

Répondre

3

Il n'est pas tout à fait clair où vos deux derniers morceaux de code sont e, mais il semble que vous deviez appeler addEventListener sur l'objet qui s'étend EventDispatcher.

C'est, si votre deuxième morceau appartient à un objet personnalisé appelé Clickable, qui étend EventDispatcher et appelle dispatchEvent() lorsque vous cliquez dessus, puis votre composant devrait appeler myClickable.addEventListener(...) où myClickable est une instance de cliquable. Cela a-t-il du sens? Mais en supposant que votre bloc de code 3e n'est pas dans la même classe que le second, il ne semble pas que vous le fassiez. Vous ajoutez un écouteur à la classe qui possède le troisième morceau de code, ce que je suppose n'est pas celui qui s'étend EventDispatcher. Un simple coup d'œil sur votre code et notez que votre second paramètre dispatchEvent est la classe et non l'instance de l'objet.

+0

Eh bien ... oui, le second morceau appartient à un objet qui envoie l'événement, mais ce n'est pas cliquable, et il ne s'étend pas EventDispatcher autant que je sache (il étend UIComponent.) Il est un objet de jeu qui se trouve dans un composant List. Lorsque cet objet de la liste est sélectionné, il distribue son événement. Chaque objet qui distribue un événement doit-il étendre EventDispatcher? – Martholomew

+0

Peut-être alors mon problème est que la liste devrait envoyer l'événement, avec l'objet sélectionné dans l'argument? – Martholomew

+1

Eh bien, DisplayObject étend EventDispatcher, donc tout ce que vous avez sur scène le sera également. Je ne sais pas qui devrait envoyer l'événement - qui sait quand le faire, je suppose, mais cela dépend de votre code. Ce qui est certain, c'est que si A distribue l'événement et que B le reçoit, alors votre appel doit être someA.addEventListener (eventType, someB.method). En ce moment vous semblez avoir B ajoutant un écouteur d'événement à lui-même. – fenomas

0

Cela ne devrait-il pas être myObject?

public function selectObject(myObject:customObject):void 
     { 
       dispatchEvent(new SelectObjectEvent("OBJECT_SELECTED", **customObject**));       
     } 
Questions connexes