在FLASH AS3.0中,为何侦听不到在自定义类的构造函数里发布的自定义事件?
4个回答
展开全部
很简单的告诉你问题所在,并不是构造函数里不能抛出事件,而是你的监听位置有问题。
<发布事件的类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的显示列表中了。
}
}
<发布事件的类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的显示列表中了。
}
}
威孚半导体技术
2024-08-19 广告
2024-08-19 广告
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层...
点击进入详情页
本回答由威孚半导体技术提供
展开全部
监听对象的父子关系你要搞清楚
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
能不能把贴几行代码,侦听不到事件,原因很多,谁也不能跟你空口说白话
追问
不好意思。。。
主要代码如下:
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();
}
}
<发布事件的类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();
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询