覆盖公共领域的属性

时间:2011-08-06 09:57:42

标签: actionscript-3

我有一个带有文本字段的自定义按钮:

package com.company.utils.ui
{
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;

    public class CustomButton extends Sprite
    {
        public var label:TextField;

标签是公开的,因为我想这样做:

var playButton:CustomButton = new CustomButton();
playButton.label.embedFonts = true;
playButton.label.antiAliasType = AntiAliasType.ADVANCED;
playButton.label.sharpness = 1;
playButton.label.thickness = 25;
playButton.label.gridFitType = GridFitType.PIXEL;
playButton.label.defaultTextFormat = customTextFormat;

但我的问题是,当我将文本分配给标签时,我需要做其他事情(调用私有的customButton私有方法)。

playButton.label.text = "myText";

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您可以创建自己的自定义TextField类,然后覆盖text属性,以便在分配值时可以使用一些额外的功能。然后在您的CustomButton类中,您的label属性可以是该自定义TextField类的实例。我做了以下示例来证明这一点:

Main.as {document class}:

package 
{
    import com.flashdevelopprojects.display.CustomButton;
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var customButton:CustomButton = new CustomButton();
            customButton.label.text = "supercalifragilisticexpialidocious";
            trace(customButton.label.text); // supercalif...

        }// end function

    }// end class

}// end package

CustomButton.as:

package com.flashdevelopprojects.display 
{
    import com.flashdevelopprojects.text.CustomTextField;
    import flash.display.Sprite;

    public class CustomButton extends Sprite 
    {
        public var label:CustomTextField;

        public function CustomButton() 
        {
            init();

        }// end function

        private function init():void
        {
            label = new CustomTextField();

        }// end function

    }// end class

}// end package

CustomTextField.as:

package com.flashdevelopprojects.text 
{
    import flash.text.TextField;

    public class CustomTextField extends TextField
    {
        override public function get text():String { return super.text }
        override public function set text(text:String):void { super.text = truncate(text) }

        private function truncate(text:String):String
        {
            return (text.length > 10) ? text.substring(0, 10) + "..." : text;

        }// end function

    }// end class

}// end class

在此示例中,将字符串值分配给label对象的text属性时,将调用私有方法truncate()并解析该字符串值。如果字符串值的长度大于10,则返回截断的原始字符串值的字符串。然后将截断的字符串分配给super.text属性。

现在,当您跟踪label对象的text属性时,您将获得截断的字符串而不是原始字符串。

答案 1 :(得分:1)

最好不要直接公开标签,而是为标签的属性创建getter / setter函数 - > Encapsulation

伪代码:

CustomButton
{
  private var label:TextField;

  public function CustomButton()
  {
     label = new TextField();
  }

  public function setLabelSharpness(sharp:int):void
  {
     label.sharpness = sharp;
  }
}

你可以为setText(txt:String)添加另一个函数,它在设置标签的text属性之前截断txt。

public function setText(txt:String):void
{
  _originalText = txt;
  txt = (txt.length > 10) ? txt.substring(0, 10) + "..." : txt;
  label.text = txt;
}

public function getText():String
{
  return label.text;
}

public function getOriginalText():String
{
  return _originalText;
}
像这样...... 欢呼声