2009-12-29 154 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

相關問題