2009-05-07 7 views
1

Je veux faire une étiquette qui a un petit titre ci-dessus, par exemple si l'étiquette dit $ avec un petit prix de détail ou notre prix au-dessus. J'essaye d'ajouter l'étiquette de titre à la liste d'affichage de l'étiquette principale. Je n'obtiens aucune erreur mais le titre n'apparaît pas. J'ai aussi considéré rawChildren mais apparemment Label n'a pas de propriété rawChildren.Flex: Label.addChild() ne fonctionne pas?

Voici mon code:

package 
{ 
    import mx.controls.Label; 

    public class PriceLabel extends StrikeThroughLabel //<-- exntension of label to add strike 
    { 
     private var _title:Label; 

     public function PriceLabel() 
     { 
      super(); 
     } 

     [Bindable] 
     public function set title(s:String):void 
     { 
      if(_title == null) 
      { 
       _title = new Label(); 
       addChild(_title); 
       this.alpha = .2; 
      } 
      _title.text = s; 
     } 
     public function get title():String 
     { 
      var s:String 
      if(_title != null) 
      { 
       s = _title.text; 
      } 
      return s; 
     } 

    } 
} 

Répondre

2

Si vous ajoutez des enfants à un composant Flex qui n'est pas un conteneur, vous devez gérer manuellement le dimensionnement et le positionnement de ces enfants. Les conteneurs font beaucoup de ce travail pour vous.

Voici ce que vous devez faire:

  1. Déplacer la création de votre enfant dans une étiquette prioritaire de la fonction createChildren().

  2. Définissez la propriété text du libellé enfant dans un remplacement de la fonction commitProperties(). Votre getter et setter title doit enregistrer la valeur dans une variable _title à utiliser plus tard pour l'affectation dans commitProperties(). C'est en fait important pour la performance.

  3. remplacer la fonction measure() et mettre à jour measuredWidth et measuredHeight être la largeur maximale et les valeurs de hauteur de l'étiquette principale et il est enfant.

  4. Remplacer updateDisplayList() et utiliser setActualSize() sur l'étiquette d'enfant pour le mettre à la largeur et à la hauteur.

Cela peut sembler beaucoup de travail, mais en termes de meilleures pratiques, c'est la façon dont vous êtes censé construire des composants personnalisés. L'équipe Flex chez Adobe a passé beaucoup de temps à optimiser les performances, et c'est pourquoi les choses se passent en plusieurs étapes comme celle-là.

Voici comment procéder en fonction de ce que vous avez demandé. Personnellement, je ferais une sous-classe de UIComponent avec deux étiquettes ou UITextFields comme enfants, chacun avec leur propre propriété séparée. À propos, la propriété rawChildren est disponible uniquement sur les conteneurs. Il existe de sorte que vous pouvez ajouter "chrome" à un conteneur qui ne fait pas partie de l'algorithme de présentation enfant du conteneur. Par exemple, Panel a une barre de titre et une bordure qui ne sont pas affectées par les options de disposition verticale/horizontale/absolue.

+0

Merci beaucoup pour cette réponse approfondie! –

1

Pourquoi ne pas créer un composant personnalisé qui contient les étiquettes comme ses enfants, au lieu d'essayer de jeter un enfant sur l'étiquette? Cela me semble plus propre, car ajouter des enfants à des composants intégrés ne me semble pas juste.

+0

J'ai pensé à cela, mais j'aime la façon dont la taille d'une étiquette est auto à son propre texte, je ne sais pas comment je pourrais faire un canevas comme ça? Y a-t-il un moyen? –

+0

Bien sûr, il suffit de définir la taille de votre canevas à la taille de l'étiquette. Il y a un rappel que vous devez remplacer lorsque vous définissez votre composant afin de définir la taille au bon moment, mais je ne me souviens plus de la méthode qui me vient à l'esprit. Les doc Flex devraient pouvoir vous le dire. – Herms