我是一个AS3菜鸟,只是想让我更舒服地使用Flash中的事件处理程序,并在我的应用程序中构建交互性。
在下面的代码中,我创建了一个名为LineChart1的DrawLineChart类的实例。当我测试电影时,它在舞台上显示得很好,当我点击它时,我可以使用trace命令来获取写入输出窗口的字符串语句。
但是,现在我希望能够在舞台上单击LineChart1并将其删除。当我这样做时,我收到一条错误消息1120:访问未定义属性LineChart1。
有人可以向我解释为什么我无法引用我的实例LineChart1以及我需要做什么以便我可以参考它并在点击它时将其删除?另外,我很想知道为什么trace语句在运行时单击LineChart1时有效,而不是removechild命令。
如果这个问题太简单,我很抱歉,但请提前感谢大家的帮助。对此,我真的非常感激。
package{
import flash.display.*;
import flash.events.*;
public class Main extends MovieClip{
var recWidth:Number = 250;
var recHeight:Number = 550;
var recX:Number = 50;
var recY:Number = 50;
var recScaleY:Number = 30;
public function Main(){
var LineChart1 = new DrawLineChart(recX, recY, recWidth, recHeight, recScaleY);
LineChart1.addEventListener(MouseEvent.CLICK, onClickHandler);
addChild(LineChart1);
}
function onClickHandler(e:Event):void{
trace("hello"); // This works. When I click on the LineChart1 MovieClip on the stage during runtime, I get "hello" as an output.
removeChild(LineChart1); // throws an error 1120: Access of undefined property LineChart1. Why?
}
}
}
答案 0 :(得分:0)
您的问题是您已将LineChart1定义为局部变量。这意味着因为你在一个函数中声明它,它只在该函数中可见。
让LineChart1
成为您班级的属性,然后您就可以从事件处理程序中看到它。或者,使用e.target as DrawLineChart
。
答案 1 :(得分:0)
您的变量本地范围为Main
,您需要将其声明为实例变量(类级别),以正确定义其范围。
private var _lineChart1:DrawLineChart;
//main function
_lineChart1 = new DrawLineChart(...
//handler function
this.removeChild(_lineChart1);
有关AS3范围的更多信息,请查看livedocs。
干杯
答案 2 :(得分:0)
所有答案都很好,但如果你在舞台上有一个以上的答案你能做什么? 您可以使用数组来获取mc的列表,然后您可以使用该数组删除舞台上的mc。 这是一个简单的例子:
package
{
import flash.display.*;
import flash.events.*;
public class Main extends MovieClip{
private var recWidth:Number = 250;
private var recHeight:Number = 550;
private var recX:Number = 50;
private var recY:Number = 50;
private var recScaleY:Number = 30;
private var lineArray:Array = new Array();
public function Main()
{
for(var i:int = 0;i<10;i++)
{
var LineChart1 = new DrawLineChart(recX, recY, recWidth, recHeight, recScaleY);
LineChart1.addEventListener(MouseEvent.CLICK, onClickHandler);
LineChart1.name = line+i.toString(); // u can use whatever u want for name's
lineArray.push(lineChart1);
addChild(LineChart1);
}
//if u want to place this 10 LineChart1 u can set x and y values like recX += recX and ect.
}
private function onClickHandler(e:Event):void
{
//when u click one of your LineChart1 and want to remove it from stage u can use this
trace(e.currentTarget.name); // if u want to see what is the name of ur mc
var myId:String = e.currentTarget.name.substring(4,10);
removeChild(getChildByName("line"+myId));
}
}
希望它适用于你