Flash自动命名舞台“实例#”上的对象

时间:2010-12-28 17:10:36

标签: flash actionscript-3 instances

我的主舞台上已放置2个TLF文本框。在属性检查器窗口中,我给出了这些实例名称:“txt1”和“txt2”。

我正在尝试单个mouseup事件,并确定它出现在哪个文本框中。

我的文档类包含以下代码:

package  {
import flash.display.Sprite;
import flash.events.KeyboardEvent;

public class SingleEvent extends Sprite{

    public function SingleEvent() {
        // constructor code
        root.addEventListener(KeyboardEvent.KEY_UP, textChanged,false,0,true);
    }

    private function textChanged(e:KeyboardEvent){
        trace(e.target.name);
        trace("   " + e.target);
        switch(e.target){
            case txt1:
                trace("txt1 is active");
                break;
            case txt2:
                trace("txt2 is active");
                break;
            default:
                break;
        }
    }

    }
}

示例输出是:

instance15
   [object Sprite]
instance21
   [object Sprite]

由于对象已经在舞台上,我不知道如何让flash将它们识别为“txt1”和“txt2”而不是“instance#”。我尝试设置.name属性,但它没有效果。

在发布设置中,我选中了“自动声明舞台实例”。

此外,是否可以为多个滑块组件进行单个更改事件?以下从未触发:

root.addEventListener(SliderEvent.CHANGE, sliderChanged,false,0,true);

感谢您提供任何提示

1 个答案:

答案 0 :(得分:0)

似乎Flash Player在调用构造函数时尚未初始化TLFTextFields。试试这个:

package  {

    import flash.display.MovieClip;
    import flash.utils.describeType;
    import flash.events.Event;

    public class TestTLF extends MovieClip {

        private function onEnterFrame (ev:Event) : void {
            removeEventListener (Event.ENTER_FRAME, onEnterFrame);
            for (var i:int = 0; i < numChildren; i++) {
                var obj:Object = getChildAt(i);
                trace (obj.name + ":"+describeType(obj));
            }
        }

        public function TestTLF() {
            addEventListener (Event.ENTER_FRAME, onEnterFrame);
        }
    }

}

除了神秘创建的附加对象“__id#”和“instance#”之外,您还会发现两个TFLTextField都被识别。

此外,您的Slider组件显然不会“冒泡”他们的SliderEvents,这意味着他们永远不会到达根对象。但是,您可以根据需要多次分配处理函数,因此您只需向每个滑块添加侦听器,所有滑块都指向相同的sliderChanged函数。