IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flex Discussion :

Custom event et listener [AIR]


Sujet :

Flex

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Par défaut Custom event et listener
    Bonjour,
    j'ai tourné le problème dans tous les sens, j'arrive pas à comprendre où j'ai déconné. Mon problème est le suivant : j'ai une classe MyClass qui émet un événement custom, et y a rien à faire j'arrive pas à le "catcher".
    Ci-dessous le code en tris partie :
    Ma classe qui va émettre l’événement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    package
    {
    	import mx.controls.Label;
     
    	public class MyClass extends Label
    	{
     
    		public function MyClass()
    		{
     
    		}
     
    		public function emitEvent():void
    		{
    			dispatchEvent(new MyClassEvent(MyClassEvent.MY_EVENT,true));
    			trace("event emitted");
    		}
     
    	}
    }
    Mon événement custom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    package
    {
    	import flash.display.InteractiveObject;
    	import flash.events.MouseEvent;
     
    	public class MyClassEvent extends MouseEvent
    	{
    		public static const MY_EVENT:String = "MY_EVENT";
     
    		public function MyClassEvent(type:String, bubbles:Boolean=true)
    		{
    			super(type, bubbles);
    			trace("event created");
    		}
     
    	}
    }
    Et enfin mon application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    <?xml version="1.0" encoding="utf-8"?>
    <mx:WindowedApplication
    	xmlns:mx="http://www.adobe.com/2006/mxml"
    	layout="absolute"
    	width="400" height="400">
     
    	<mx:Script>
    		<![CDATA[
    			import MyClass;
     
    			private var _mc:MyClass;
     
    			private function createMyClass():void {
    				_mc = new MyClass();
    				trace("class created");
    			}
     
    			public function createListener():void {
    				this.addEventListener(MyClassEvent.MY_EVENT, catchEvent);
    				trace("listener added");
    			}
     
    			public function verifyListener():void {
    				if (this.willTrigger(MyClassEvent.MY_EVENT))
    					trace("listener verified by willTrigger");
    				if (this.hasEventListener(MyClassEvent.MY_EVENT))
    					trace("listener verified by hasEventListener");
    			}
     
    			private function launchSignal():void {
    				_mc.emitEvent();
    			}
     
    			private function catchEvent(event:MyClassEvent):void {
    				trace("event catched !!");
    			}
     
     
    		]]>
    	</mx:Script>
     
    	<mx:VBox width="100%" height="100%" paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">
    		<mx:Button label="Create" click="createMyClass();" />
    		<mx:Button label="Add listener" click="createListener();" />
    		<mx:Button label="Verify listener" click="verifyListener();" />
    		<mx:Button label="Signal" click="launchSignal();" />		
    	</mx:VBox>
    </mx:WindowedApplication>
    Lorsque j'execute mon programme et que je clique successivement sur les 4 boutons, toutes les étapes se réalisent correctement mais au final la dernière ne me permet pas de "catcher" mon événement comme en atteste la sortie console ci-dessous :
    [SWF] preview.swf - 1*040*971 bytes after decompression
    class created
    listener added
    listener verified by willTrigger
    listener verified by hasEventListener
    event created
    event emitted
    Je n'ai pas le message "event catched !!" indiquant que mon événement à bien été intercepté

    Ca fait plusieurs jours que je creuse, et j'ai pas trouvé, j'imagine que ça doit être tout con, mais je vois pas ce que j'ai oublié. Quelqu'un a t'il une idée pour me mettre sur la voie ?
    D'avance merci.

  2. #2
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Bonjour,

    If you want an MXML component to be able to register a listener for the event, you must make the event known to the Flex compiler by using the [Event] metadata tag. For each public event that your custom component dispatches, you add an [Event] metadata keyword before the class definition that defines that event, as the following example shows:
    essaie de modifier ta classe MyClass de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    package
    {
    	import mx.controls.Label;
     
            [Event(name="MY_EVENT", type="MyClassEvent")]
    	public class MyClass extends Label
    	{
     
    		public function MyClass()
    		{
     
    		}
     
    		public function emitEvent():void
    		{
    			dispatchEvent(new MyClassEvent(MyClassEvent.MY_EVENT,true));
    			trace("event emitted");
    		}
     
    	}
    }
    PS: ne pas créer de package, c'est moche

    ++

  3. #3
    Membre averti
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Par défaut
    Merci MadFrix pour cette réponse, j'avais effectivement déjà vu cette info. dans la doc, et j'ai déjà essayé avec et sans ce metadata, ça change rien, toujours pas d’événement catched

    P.S. : A titre d'info et sans faire dériver le sujet, pourquoi c'est mal les packages ?

  4. #4
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Citation Envoyé par Chance666 Voir le message
    P.S. : A titre d'info et sans faire dériver le sujet, pourquoi c'est mal les packages ?
    en fait je disais que tu n'utilises pas de package (enfin tu utilises celui par défaut). C'est pas très structuré, mais je me doute que tu fais des tests donc que tu codes pas forcément très "proprement" pour le moment.

    Concernant ton problème, tout marche bien et tout est correctement dispatché sauf que tu ecoutes pas au bon endroit. C'est _mc qui dispatche l'événement, place donc un ecouteur sur lui au lieu de l'application

  5. #5
    Membre averti
    Inscrit en
    Février 2003
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 47
    Par défaut
    Yeahhhhhhhhhh !!!!
    Merci beaucoup Madfrix, ça fait bien 2 semaines que je traine sur ce pb, je le laisse reposer quelques jours avant d'y revenir régulièrement en me disant qu'avec le temps j'aurai peut-être la bonne solution, mais rien n'y a fait, ta dernière solution est effectivement la bonne.

    P.S. : effectivement pour le package, j'ai développé ce use-case pour illustrer mon problème, mon code original est mieux structuré ;-)

  6. #6
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Si je peux me permettre un conseil aussi pour ta future appli, utilise un framework comme PureMVC, certes tu vas perdre quelques jours pour connaitre le fonctionnement, mais le système d'événement est bien mieux géré je trouve (basé sur le pattern Observer). En plus une fois que tu as le framework en main, tu codes plus vite et plus proprement

    Et puis dernier conseil, passe de Flex3 à Flex4

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de Custom Events
    Par georges_jung dans le forum Flex
    Réponses: 3
    Dernier message: 25/12/2008, 17h40
  2. xaml dynamique avec un custom event
    Par sanouk dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 12/12/2008, 17h56
  3. Web Custom Event et Javascript
    Par Driyo dans le forum ASP.NET
    Réponses: 2
    Dernier message: 17/06/2008, 17h09
  4. Custom Event entre deux composants
    Par Will66 dans le forum MXML
    Réponses: 1
    Dernier message: 03/01/2008, 13h20
  5. Custom Event Set
    Par toure32 dans le forum JBuilder
    Réponses: 1
    Dernier message: 26/08/2005, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo