2009-12-29 5 views
0

Je suis en train d'étendre une classe comme panneau pour que je puisse tirer des événements cliquez uniquement lorsque la zone de titre est cliqué. La zone de titre est un composant protégé de Panel appelé titleBar. Je veux donc rendre ce composant public.faire une propriété protégée publique

Il semble que je suis presque là, mais je reçois un "TypeError: Erreur # 1009: Impossible d'accéder à une propriété ou une méthode d'une référence d'objet nul." quand il essaie d'ajouter un écouteur d'événement à la barre de titre.

ici est mon panneau étendu

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; 
     } 
    } 
} 

Voici une version réduite de l'AS J'appelle en ma fonction qui crée un nouveau panneau:

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

L'erreur est pointée à la dernière ligne. Qu'est-ce que je rate?

Merci

Edit: par la réponse ci-dessous, je suis en train d'essayer cela:

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; 
     } 
    } 
} 

Et puis cela dans l'AS:

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

obtenir toujours la même erreur. C'est un tout nouveau terrain pour moi, quelle est ma prochaine étape?

Répondre

1

Votre problème est que vous essayez d'accéder à la barre de titre avant sa création (via createChildren). Au lieu de cela, ajoutez l'écouteur d'événement une fois la création terminée. Par exemple:

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

(De même, vous ne pouvez pas affecter le TitleBar dans le constructeur dans votre premier effort, en tant que composant enfant est pas encore créé.)

+0

Merci, je me sens comme un cancre parfois ne pas savoir l'ordre des choses, c'est la première fois que j'ai vraiment essayé de faire quelque chose avec l'extension d'une classe au-delà d'ajouter des tailles simples ou des styles. – invertedSpear

2

Vous ne pouvez pas rendre publique une propriété protégée. Vous pouvez cependant écrire une fonction accesseur qui retournera la propriété protégée.

+0

Et vous pouvez ajouter une enveloppe publique une méthode de setter protégée. –

+0

Même lorsque vous prolongez la classe? Y at-il un moyen d'obtenir la classe Panel et de rendre mon propre panneau avec cette propriété public? – invertedSpear

+0

Oui, même en l'allongeant. Vous devrez réécrire la classe Panel dans la base de code flexible, ce qui est une très mauvaise idée. Il suffit d'écrire une fonction getTitleBar. – Pace

Questions connexes