Bonjour à tous,
Je sollicite votre aide, car cela fait trois jours que je suis bloqué sur un problème. J'ai l'impression d'appliquer la documentation, ainsi que les documents glanés sur le WEB, mais je ne parviens pas à atteindre mon objectif.
Mon objectif est le suivant : Je désire envoyer un évènement à un ensemble de composants.
Après avoir lu la littérature qui traite de ce sujet, j'ai procédé de la façon suivante :
- J'ai créé une classe qui implémente un évènement "sur mesure" (qui hérite de la classe "flash.events.Event"). Je signale que cette classe écrase la méthode "clone()" (paraît que c'est important).
- Pour envoyer l'évènement j'utilise la méthode "dispatchEvent".
- Et j'ai ajouté à tous les composants concernés par mon évènement un gestionnaire d'évènement, via la méthode "addEventListener()".
Pour illustrer mon propos, j'ai codé un petit exemple simple.
Fichier broadcast\src\broadcast.mxml
Fichier broadcast\src\components\eventTarget.mxm
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 <?xml version="1.0" encoding="utf-8"?> <!-- Fichier broadcast\src\broadcast.mxml --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" xmlns:custom="components.*"> <mx:Script> <![CDATA[ import components.eventTarget; import actionScript.MyOwnEvent; // Cette fonction est censée envoyer l'évènement "MyOwnEvent". private function ButtonEnvoyerOnClick(event:Event):void { // Le deuxième argument vaut "false". Donc, le rectangle rouge devrait disparaître. var ev:MyOwnEvent = new MyOwnEvent("MyOwnEvent", false, true); dispatchEvent(ev); } ]]> </mx:Script> <!-- Je ne suis pas sûr que cette déclaration soit utile. Je ne suis pas sûr, non plus, qu'elle soit correcte. --> <mx:Metadata> [ Event( name="MyOwnEvent", type="actionScript.MyOwnEvent") ] </mx:Metadata> <mx:VBox> <!-- En cliquant sur ce bouton, cela devrait envoyer l'évènement "MyOwnEvent". --> <mx:Button label="Envoyer" click="ButtonEnvoyerOnClick(event)"/> <!-- Ce composant a ajouté un gestionnaire d'évènement sur l'évènement "MyOwnEvent". --> <custom:eventTarget/> </mx:VBox> </mx:Application>
Fichier broadcast\src\actionScript\MyOwnEvent.as
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 <?xml version="1.0" encoding="utf-8"?> <!-- Fichier broadcast\src\components\eventTarget.mxm --> <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100" height="50" backgroundColor="#FF0000" creationComplete="init()"> <mx:Script> <![CDATA[ import actionScript.MyOwnEvent; // J'ajoute le gestionnaire d'évènement. private function init():void { this.addEventListener("MyOwnEvent", this.onMyOwnEvent); } // Le composant devrait disparaître ou apparaître. private function onMyOwnEvent(event:MyOwnEvent):void { if (event.getVisibility()) { this.visible = true; } else { this.visible = false; } } ]]> </mx:Script> <mx:Label text="Composant cible"/> </mx:Canvas>
Manifestement, l'évènement n'atteint pas sa cible.
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 // Fichier broadcast\src\actionScript\MyOwnEvent.as // Ici, je définis mon évènement. package actionScript { import flash.events.Event; public class MyOwnEvent extends Event { private var __booleanVisibilty:Boolean = new Boolean(); private var __booleanBubbles:Boolean = new Boolean(); private var __booleanCancelable:Boolean = new Boolean(); private var __stringType:String = new String(); public function MyOwnEvent(type:String, visibility:Boolean, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); __stringType = type; __booleanVisibilty = visibility; __booleanBubbles = bubbles; __booleanCancelable = cancelable; } override public function clone():Event { return new MyOwnEvent(__stringType, __booleanVisibilty, __booleanBubbles, __booleanCancelable); } public function getVisibility():Boolean { return __booleanVisibilty; } } }
Je suis bloqué... Quelqu'un peut-il m'aider?
Note : Le ZIP de l'exemple est joint à cette question.
Merci à tous,
Denis
Partager