将受保护的财产公之于众

时间:2009-12-29 18:43:56

标签: flex actionscript class

我正在尝试扩展类似面板的类,以便只有在单击标题区域时才能触发单击事件。标题区域是Panel的受保护的uicomponent,名为titleBar。所以我想公开这个组件。

好像我差不多了但是我得到了一个“TypeError:错误#1009:无法访问空对象引用的属性或方法。”当它试图将事件监听器添加到标题栏时。

这是我的扩展面板

package custClass{    
    import mx.containers.Panel;
    import mx.core.UIComponent;
    public class ExtPanel extends Panel{

        [Bindable] public var TitleBar:UIComponent;

        public function DragPanel(){
            super();
            TitleBar = super.titleBar;
        }
    }
}

这是我在我的函数中调用的AS的修剪版本,它正在创建一个新面板:

var newPanel:ExtPanel = new ExtPanel ();
newPanel.TitleBar.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);

错误指向最后一行。我错过了什么?

由于

编辑: 根据以下答案,我现在正在尝试这个:

package custClass{    
    import mx.containers.Panel;
    import mx.core.UIComponent;

    public class extPanel extends Panel{

        public function extPanel(){
            super();
        }

        public function getTitleBar():UIComponent{
            return this.titleBar;
        }
    }
}

然后在AS中:

newPanel.getTitleBar().addEventListener(MouseEvent.ROLL_OVER,over);

仍然得到同样的错误。这对我来说是一个全新的基础,我的下一步是什么?

2 个答案:

答案 0 :(得分:2)

您无法公开受保护的财产。但是,您可以编写一个将返回受保护属性的访问器函数。

答案 1 :(得分:1)

您的问题是您在创建之前尝试访问标题栏(通过createChildren)。而是在创建完成后添加事件侦听器。例如:

var newPanel:ExtPanel = new ExtPanel ();
newPanel.addEventListener(FlexEvent.CREATION_COMPLETE, function(event:Event):void {
    newPanel.getTitleBar().addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
});

(同样,您不能在第一次尝试时在构造函数中分配TitleBar,因为尚未创建子组件。)