在FLASH AS3.0中,为何侦听不到在自定义类的构造函数里发布的自定义事件?

如题,如果把dispatchEvent写在该自定义类的其他函数里面,却可以侦听到?... 如题,如果把dispatchEvent写在该自定义类的其他函数里面,却可以侦听到? 展开
 我来答
jamesge1979
2011-09-14 · TA获得超过461个赞
知道小有建树答主
回答量:210
采纳率:0%
帮助的人:269万
展开全部
很简单的告诉你问题所在,并不是构造函数里不能抛出事件,而是你的监听位置有问题。

<发布事件的类myClass>
public class myClass extends EventDispatcher
{
public function myClass() {
dispatchEvent(new Event("hello"));
}
}
<文档类main>
public class main extends Sprite
{
public function main() {
var myclass:myClass=new myClass();
myclass.addEventListener("hello", myFun)
}


以你的这个程序为例,你在addlistener前,已经dispathch了事件,你说如何监听到?
那么,是不是改换一下监听位置就行了呢?比如下面这样:
public function main() {
var myclass:myClass;
myclass.addEventListener("hello", myFun);
//报错,myclass对象在没有构造前无法添加事件监听;
myclass=new myClass();
}

这个一样会报错,因为在一个对象尚未构造前就对它去监听的话是无法实现的,编译器会告诉你目标找不到该属性或方法:
那么,如果你一定要在构造函数里发出事件,并让main监听到又该怎么办呢?看以下这个:

<发布事件的类myClass>
public class myClass extends Sprite
{
public function myClass(m:main) {
main.addChild(this);
//在发出事件前将自己加入main的显示列表
dispatchEvent(new Event("hello"));
}
}
<文档类main>
public class main extends Sprite
{
public function main() {
this.addEventListener("hello",myFun,true);
//先为自己添加监听,一旦自己显示列表中的显示对象发出"hello"事件就可以捕获到该事件。注意,此时的useCapture参数需要置为“true”,因为你抛出的是一个在捕获阶段才能捕获的事件。
var myclass:myClass=new myClass(this);
//把自己当成参数传给myclass,这样myclass就可以将它自己添加到main的显示列表中了。
}
未学随空che2f
2011-09-13 · TA获得超过307个赞
知道小有建树答主
回答量:1511
采纳率:0%
帮助的人:740万
展开全部
监听对象的父子关系你要搞清楚
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
johnAsk
2011-09-13 · 超过26用户采纳过TA的回答
知道答主
回答量:47
采纳率:0%
帮助的人:75.6万
展开全部
能不能把贴几行代码,侦听不到事件,原因很多,谁也不能跟你空口说白话
追问
不好意思。。。
主要代码如下:

public class myClass extends EventDispatcher
{
public function myClass() {
dispatchEvent(new Event("hello"));
}
}

public class main extends Sprite
{
public function main() {
var myclass:myClass=new myClass();
myclass.addEventListener("hello", myFun)
}
追答
AS3.0好像遵循谁发送谁侦听的原则, 你可以考虑用一个类专门来发送和侦听事件,参考单例模式,发送事件的为这个类的一个静态属性,它持有这个类的唯一实例.因为它是静态属性,因此它是全局的(只要这个类被载入了内存中),因为即使你做一个AIR程序,其中有几个独立的窗口,也可以通过这种方式来实现窗口间的通信.

package {
import flash.events.EventDispatcher;

public class ControlCenter extends EventDispatcher {
static private var _isClosing:Boolean = false;//实例化开关
static private var _controller:ControlCenter;//类实例
//-------------------获取单例-------------------------
static public function get controller():ControlCenter {
if (ControlCenter._controler == null) {
ControlCenter._isClosing = true;
ControlCenter._controller=new ControlCenter();
ControlCenter._isClosing = false;
}
return ControlCenter._controler;
}

//-------------------获取单例-------------------------
//-------------------构造函数-------------------------
public function ControlCenter() {
if (ControlCenter._isClosing == false) {
throw new Error("ControlCenter:无法实例化");
}
}// constructor code
//-------------------构造函数-------------------------
}//class

}//package
------------------------------------在下面这个类中发送事件---------
package{
public class DispatchHere{
public function DispatchHere(){
ControlCenter.controller.dispatchEvent(new Event("thisIsForOnlyTest"))
}// constructor code
}//class
}//package
----------------------------在下面这个类中接收事件------------------
package{
public class ListenHere{
public function ListenHere(){
ControlCenter.controller.addEventListener("thisIsForOnlyTest",eventHander)
}//constructor cod
private eventHander(e:Event):void{
do sth. here
}
}
}//package

如果还有什么疑问可以追问,会的我尽量回答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-09-14
展开全部
主要代码如下:
<发布事件的类myClass>
public class myClass extends EventDispatcher
{
public function myClass() {
//dispatchEvent(new Event("hello"));
}
public function dis() {
dispatchEvent(new Event("hello"));
}
}
<文档类main>
public class main extends Sprite
{
public function main() {
var myclass:myClass=new myClass();
myclass.addEventListener("hello", myFun)
myclass.dis();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式