我正在尝试扩展类似面板的类,以便只有在单击标题区域时才能触发单击事件。标题区域是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);
仍然得到同样的错误。这对我来说是一个全新的基础,我的下一步是什么?
答案 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
,因为尚未创建子组件。)