2009-12-29 89 views
0

我试图扩展一个面板类,这样我只能在单击标题区域时触发点击事件。标题区域是一个名为titleBar的Panel的受保护的组件。所以我想公开这个组件。公开一个受保护的属性

看来我几乎在那里,但我得到一个“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); 

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

回答

1

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

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

(同样,你不能分配在构造函数中TitleBar在你的第一次努力,作为子组件尚未创建)。

+0

谢谢,我觉得自己有时不知道事情的顺序,这是我第一次真正尝试着扩展一个类,而不仅仅是添加一些简单的尺寸或样式。 – invertedSpear 2009-12-30 00:03:08

2

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

+0

你可以将一个公共的包装受保护的setter方法。 – 2009-12-29 18:55:41

+0

即使你扩展课程?有没有办法获得Panel类,并使用该属性公开创建我自己的面板? – invertedSpear 2009-12-29 19:40:13

+0

是的,即使延长它也是如此。你必须在Flex代码库中重写Panel类,这是一个非常糟糕的主意。只需编写一个getTitleBar函数。 – Pace 2009-12-29 20:41:51

相关问题